접속 기반 프로토콜(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 |