본문 바로가기
코스웨어/15년 스마트컨트롤러

20151201 - 홍준모(WinSock) - 1일 차

by 알 수 없는 사용자 2015. 12. 1.
728x90
반응형

C++은 C의 포장 판인 것이고, MFC 도 Win32 를 통하지 않고는 동작을 못한다.


윈도우 소켓을 만들려고 한다면, 유닉스에서 따르는 것도


유닉스랑 다른 개념은,


  if(WSAStartup(MAKEWORD(2,2),&wsaData)!= 0) 
    { 
        printf("error\r\n"); 
        return 0; 
    } 
 WSACleanup(); 


WSAStartup()
WSACleanup()

이 두개의 함수 가 반드시 존재해야 한다라는 점이고,

Startup() 는 첫번째 인자에 MAKEWORD()로 버전을 알려줘야 한다.




#include <winsock.h>
#include <stdio.h>

#pragma comment (lib, "wsock32.lib")

int main(void)
{
  WSADATA wsaData;
  int iRet;

  iRet = WSAStartup(MAKEWORD(22), &wsaData);
  if (0 == iRet)
  {
    printf("WSAStartup() Error!\n");
    return 0;
  }

  
  WSACleanup();
  return 0;
}

현재 화면이다. 이건 예전 버전 윈속 라이브러리를 추가한 코드 고,


#include <winsock2.h>
#include <stdio.h>

#pragma comment (lib, "ws2_32.lib")

int main(void)
{
  WSADATA wsaData;
  int iRet;

  iRet = WSAStartup(MAKEWORD(22), &wsaData);
  if (0 == iRet)
  {
    printf("WSAStartup() Error!\n");
    return 0;
  }

  
  WSACleanup();
  return 0;
}


이건 최신버전이다.


gcc 에서도


컴파일 시에 -lsocket 으로 소켓 라이브러리를 원래는 넣어야 했었는데 지금은 gcc 버전이 높아지면서 이 라이브러리 추가를 안해도 되는 것으로 바뀌었다.

유닉스에서 빼꼈기에 형태는 비슷하지만 스타트업이랑 클린업이 반드시 존재해야 한다.

그래서 어떤 면에서는 리눅스 쪽이 더 낫다. 불편한 점 이다 이 부분은,


라. MAKEWORK 매크로

1
2
3
4
WORD MAKEWORD(
    BYTE    bLow;   //하위비트
    BYTE    bHigh;   //상위비트
);

 

htons() 이건 원래 유닉스 용 소켓 함수다. 그러니까 될지 않될지 모르는 것. 꼭 실험 해봐야 하는 것이다.

inet_addr() 이건 원래 윈도우에서도 가능하다.




SOCKET socket(

int af,

int type,

int protocol

);


AF       -> 주소 체계

type     -> 소켓 타입

protocol ->사용할 통신규약


주소 체계(Address Family)

자신이 사용할 프로토콜을 사용하기 위한 지정방법.

AF_INET   -> IPv4 기반 TCT / UDP

AF_INET6 -> IPv6 기반 TCT / UDP

AF_IRDA  -> Infra Red Data Association 무선 적외선 통신

AF_BTH   -> 블루투스.

ㄴ AF대신에 PF(Protocol Family)를 사용할 수도 있고 가능하지만, 대개는 AF를 사용하므로 AF를 사용하자.


소켓 타입(socket Type)

사용할 프로토콜의 특성을 나타내는 값.

SOCK_STREAM : 신뢰성 있는 데이터 전송 / 연결형 프로토콜

SOCK_DGRAM : 신뢰성 없는 데이터 전송 / 비 연결형 프로토콜


프로토콜

주소의 체계와 소켓 타입만으로는 결정할 수 없는 경우가 있다. 두 정보가 같아도 다른 케이스가 있기 때문이다. 그러나 TCP / UDP 프로토콜은 주소 체계와 소켓 타입마능로 프로토콜을 결정할 수 있으므로, 대개는 0 을 사용한다.




윈속의 서버와 클라이언트 동기식 채팅 프로그램은 이러하다.


리눅스 쪽 bind() 와 윈도우 쪽 bind() 도 쓸 때 주의해야 한다. 인자값이 다를 수 있다.

이런 차이점들을 잘 정리 해놔야 한다.동기식 채팅 프로그램


바. bind() 함수

1
2
3
4
5
int bind(
    SOCKET   sockfd,   //소켓의 파일 디스크립터
    const struct sockaddr FAR * name,   //SOCKADDR_IN 구조체 포인터
    int   namelen   //인자로 전달된 주소 정보 구조체의 길이
);



구조체의 정보를 등록 시키기 위해서만 필요하고,

바인드 시키는 순간 이 구조체는 소켓에 들어 앉기 때문에 필요가 없어진다.

들어오는 애의 정보를 가져오기 때문에 따로 구조체를 쓰는데 이미 바인드()를 통과했기에 필요가 없으므로 재활용














728x90