3 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 : 함수에 행동에 영향을 줄 집합
비동기 소켓방식
버퍼의 상태를 확인해 주는 함수를 이용한다.
유닉스 비동기 소켓 방식
int PASCAL FAR select(__in int nfds, __inout fd_set *readfds, __inout fd_set *writefds, __inout fd_set *exceptfds, __in const struct timeval *timeout);
하나 또는 그 이상의 소켓의 상태를 결정한다. 필요하다면 기다리는 동기식 입출력을 수행한다.
리턴 : 성공시 fd_set 구조체에 포함되고 준비된 소켓 핸들의 총 수. 실패시 SOCKET_ERROR
nfds : 검사할 범위를 지정
readfds : 읽을 준비가 되었는 지 검사할 descriptor 지정.
writefds : 쓸 준비가 되었는 지 검사할 descriptor 지정.
exceptfds : exception이 발생했는 지 검사할 descriptor 지정. out-of-band data 도착.
timeout : select가 기다릴 최대 시간. TIMEVAL 구조체의 형태로 제공된다.
윈도우즈 비동기 소켓 방식
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
'컴퓨터 공부 > 네트워크 프로그래밍' 카테고리의 다른 글
[6월 2일 2,3교시] 소켓 프로그래밍 이론 (0) | 2009.06.02 |
---|---|
[6월 2일 1교시] 소켓 프로그래밍 이론 (0) | 2009.06.02 |
[6월 1일 2교시] 소켓 프로그래밍 이론 (0) | 2009.06.01 |
[6월 1일 1교시] 소켓 프로그래밍 이론 (0) | 2009.06.01 |
[5월 30일 3교시] OSI 7 계층(소켓 프로그래밍) (0) | 2009.05.30 |