접속 기반 프로토콜(Connection Oriented Protocol)



SOCKET PASCAL FAR socket(int af, int type, int protocol);

참고주소 : http://msdn.microsoft.com/en-us/library/ms740506(VS.85).aspx

특정 전송 서비스 제공자로 바인드 될 소켓을 생성한다.

리턴 : 성공시 소켓의 핸들. 실패시 INVALID_SOCKET.

af : address family를 정한다.

 - AF_INET(IPv4), AF_IPX, AF_APPLET!ALK, AF_NETBIOS, AF_INET6(IPv6), AF_IRDA, AF_BTH

type : 새로운 소켓이 어떤 형태인지 정한다.

 - SOCK_STREAM : OOB data 전송 메카니즘을 가진 순서화된 신뢰성 있는 양방향, 접속 기반 바이트 스트림을 제공한다.

 - SOCK_DGRAM : 고정된 최대 크기의 신뢰성 없고 접속하지 않는 버퍼인 데이터그램을 제공한다.

 - SOCK_RAW : Layer 3 프로그래밍을 하고 싶을 때

   예시) ping(컴퓨터가 살았나 죽었나, round-trip), tracert

protocol : 사용될 프로토콜

 - IPPROTO_TCP, IPPROTO_UDP


well-known port(0~1024) : 사람들이 자주 사용하는 포트. 21: ftp, 23: telnet, 25 : SMTP, 80 : web


Socket Address 구조체

참고주소 : http://msdn.microsoft.com/en-us/library/aa252969(VS.60).aspx

struct sockaddr_in{

    short            sin_family;

    unsigned short      sin_port;

    struct   in_addr      sin_addr;

    char               sin_zero[8];

};


sin_family : address family ( AF_INET이어야 한다. )

sin_port : 16비트 포트 번호. htons계열의 함수가 필요하다.

sin_addr : IP 주소. inet_addr함수나 htonl계열의 함수가 필요하다.

sin_zero : 사용되지 않음.


int pascal FAR bind(SOCKET s, struct sockaddr FAR *addr, int namelen);

참고주소 : http://msdn.microsoft.com/en-us/library/ms737550(VS.85).aspx

소켓 핸들과 소켓 구조체를 연관시키고 시스템에게 묶어달라고(bind) 요청한다.

소켓과 지역(현재 컴퓨터) 주소를 연관시킨다.

리턴 : 성공시 0. 실패시 SOCKET_ERROR. 더 자세한 오류코드는 WSAGetLastError를 참고.

s : bind되지 않은 소켓을 나타내는 descriptor

name : sockaddr 구조체로부터 소켓을 지정할 주소

namelen : 바이트 단위. name 전달인자 값의 길이


int PASCAL FAR listen(SOCKET s, int backlog);

참고주소 : http://msdn.microsoft.com/en-us/library/ms739168(VS.85).aspx

포트를 감시모드로 바꾼다.

들어오는 접속에 대해 듣고 있는 상태의 소켓으로 만든다.

리턴 : 성공시 0, 실패시 SOCKET_ERROR

s : 접속되지 않고 bind된 소켓을 나타내는 descriptor

backlog 

 - 기라디는 접속 큐의 최대 길이. (로스터에 올라간 사람 수. 최소 1이상)

 - SOMAXCONN이면 최대로 합리적인 값으로 backlog를 설정.


SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen);

참고주소 : http://msdn.microsoft.com/en-us/library/ms737526(VS.85).aspx

클라이언트가 올 때까지 blocking되었다가 클라이언트가 접속하면 요구를 받아준다.

소켓으로 들어오는 시도를 한 접속을 허가한다.

s : listen 함수에 의해 listen 상태인 소켓을 나타내는 descriptor

addr : 접속한 개체의 주소를 받는 버퍼의 포인터. 접속 peer 프로세스(클라이언트)의 주소를 리턴한다.

addrlen : addr 전달인자를 가리키는 구조체의 길이를 포함한다.


int pascal FAR connect(SOCKET s, struct sockaddr FAR *addr, int namelen);

참고주소 : http://msdn.microsoft.com/en-us/library/ms737625(VS.85).aspx

특정 소켓으로 접속한다.

리턴 : 성공시 0, 실패시 SOCKET_ERROR

s : 접속되지 않은 소켓을 나타내는 descriptor

name : 접속이 설정될 sockaddr 구조체의 포인터

namelen : name 전달인자가 가리키는 sockaddr 구조체의 길이(바이트 단위)


port to port connection

single server는 2개의 소켓을 가진다.

multi server는 n+1 개의 소켓을 가진다.


Blocked : 현실적으로 어느 코드 부분에 멈춰 있음

Blocking : 호출을 하면 정지할 가능성이 있는 코드. 오류나 결과가 나올 때까지 멈춰 있음.

예시) 윈도우즈 상에서 '응답 없음' 표시(잠재적으로 멈출 수 있는 코드 : 파일, 네트워크)


nonblocking : 호출하자마자 바로 리턴한다. 결과가 나올 때까지 반복 호출. 프로그램이 멈출 일이 없다.


asynchronous mode : 결과가 나올 때 시그널, 인터럽트, 메세지를 보내서 확인한다. 프로그램이 멈출 일이 없다. WSA계열 함수(Windows Socket Asynchronous)



 way handshake 방식을 통해 접속을 설정한다.

send() <-> recv()

socket은 패킷을 받아 buffer(수십K바이트)에 보관한다.


패킷단위

스트림단위

소켓단위(버퍼)


send buffer : send() 함수는 보낼 내용을 send buffer에 담는 역할을 한다. 프로그래머가 신경 쓸 필요가 없다.

receive buffer : recv() 함수는 receive buffer에 있는 받을 내용을 가지고(읽어) 온다.


send buffer가 꽉 차있다면 send(), write() 함수는 기다려야 한다. (blocking)

receive buffer가 비어 있는데 recv(), read() 함수는 기다려야 한다. (blocking)


int send(__in  SOCKET s, __in  const char *buf, __in  int len, __in  int flags);

참고주소 : http://msdn.microsoft.com/en-us/library/ms740149(VS.85).aspx

접속된 소켓에 데이터를 보낸다.

리턴 

성공시 len 전달인자에서 보내질 요청된 수보다 작을 가능성이 있는 보내진 바이트 수.

실패시 SOCKET_ERROR

s : 접속된 소켓을 나타내는 descriptor

buf : 보낼 데이터를 포함한 버퍼의 포인터

len : buf가 가리키는 데이터의 길이(바이트 단위)

flags : 호출하는 방법을 정의하는 집합.


int recv(__in   SOCKET s, __out  char *buf, __in   int len, __in   int flags);

참고주소 : http://msdn.microsoft.com/en-us/library/ms740121(VS.85).aspx

접속된 소켓이나 바인드된 비접속 소켓으로부터 데이터를 받는다.

리턴 : 성공시 받은 바이트 수 실패시 SOCKET_ERROR

s : 접속된 소켓을 나타내는 descriptor

buf : 들어올 데이터를 받을 버퍼 포인터

len : buf가 가리키는 데이터의 길이(바이트 단위)

flags : 함수에 행동에 영향을 줄 집합


비동기 소켓방식

버퍼의 상태를 확인해 주는 함수를 이용한다.

 


윈도우즈 비동기 소켓 방식

WSAAsyncSelect(소켓 핸들, 윈도우 핸들, 윈도우즈 user-defined message, 소켓 이벤트)

소켓 이벤트(4)가 발생하면 윈도우즈 user defined message(3)를 윈도우 핸들(2)에 보낸다.

소켓 하나에 user defined message는 하나만 등록 가능하다.

※ 취소하는 경우 : e = WSAAsyncSelect(socket, hWnd, 0, 0); 


int WSAAsyncSelect(__in  SOCKET s, __in  HWND hWnd, __in  unsigned int wMsg, __in  long lEvent);

참고주소 : http://msdn.microsoft.com/en-us/library/ms741540(VS.85).aspx

소켓에 대한 네트워크 이벤트의 윈도우 기반 알림(notification)을 요청한다.

s : 이벤트 알림(notification)이 요구되는 소켓을 나타내는 descriptor

hWnd : 네트워크 이벤트가 발생할 때 메세지를 받게 될 윈도우 핸들.

wMsg : 네트워크 이벤트가 발생할 때 받게될 (사용자 정의) 메세지.

lEvent : 응용 프로그램이 관심있는 네트워크 이벤트의 조합을 나타내는 비트마스크


소켓 이벤트(lEvent)

FD_READ : receive 버퍼에 무엇인가 들어왔다.

FD_WRITE : send 버퍼에 쓸 수 있다.

FD_OOB : FD_READ의 특수한 형태.

FD_ACCEPT : 접속 요구가 들어왔다.

FD_CONNECT : 접속이 되었다. 서버와 연결에 성공하였음.

FD_CLOSE : 상대방과 socket 연결이 끊어짐.


윈도우 프로시저를 호출할 때 전달되는 인자

wParam : 소켓 식별자

LOWORD(lParam) : 발생한 이벤트 종류. WSAGETSELECTEVENT(lParam)와 같은 뜻

HIWORD(lParam) : 에러 상태. WSAGETSELECTERROR(lParam)와 같은 뜻


closesocket() : 유닉스는 소켓 닫는 함수를 close()를 쓰지만 윈도우즈는 closesocket을 사용한다.


int closesocket(__in  SOCKET s);

참고주소 : http://msdn.microsoft.com/en-us/library/ms737582.aspx

현재 존재하는 소켓을 닫는다.

리턴 : 성공시 0, 실패시 SOCKET_ERROR

s : 닫을 소켓을 나타내는 descriptor



출처 http://blog.daum.net/sdr1982/

'API & MFC > 네트워크프로그래밍' 카테고리의 다른 글

EventSelect란?  (0) 2010.02.05
ASyncSelect 예제  (1) 2010.02.04
소켓통신의 라이브러리 사용 선택 시 고려사항  (0) 2010.02.02
소켓함수 예제(로그인서버)  (0) 2010.01.25
OSI 모델 And Ip계층  (0) 2010.01.18
Posted by 아몰라