접속 기반 프로토콜(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
소켓통신(함수정리)  (1) 2010.01.18
OSI 모델 And Ip계층  (0) 2010.01.18
Posted by 아몰라

댓글을 달아 주세요

  1. 2013.01.05 20:31

    In a nutshell, http://www.moncleroutletespain.com/ moncler, JetKonnect caters to all the needs of the passengers who opt for low fare services. JetKonnect passengers are required to buy their meals during the journey, http://www.moncleroutletespain.com/ moncler chaquetas. Jet Konnect have a separate code or flight numbers which helps the travel agents and passengers to distinctly identify them. This airline provides the flexibility which helps to meet the changing trends and requirements. Load factor and number of passengers have shown to be increased in Jet Konnect airlines by 70% and 35% respectively.Detailed information about these airlines can be obtained from official website of Jet Konnect. It is always good to understand each and every detail before booking the air tickets, http://www.moncleroutletespain.com/ moncler outlet. Schedule for booking the tickets for various destinations can also be found at this website. Payment for tickets and meals can be made online, http://www.moncleroutletespain.com/ moncler españa. JetKonnect airlines are making good amount of profit, http://www.moncleroutletespain.com/ moncler online. These airlines are really performing well and are expected to improve more in future, http://www.moncleroutletespain.com/ http://www.moncleroutletespain.com/.Related articles:


    http://sunder4.tistory.com/43 http://sunder4.tistory.com/43

    http://hoyasoft.tistory.com/?page=9 http://hoyasoft.tistory.com/?page=9

이전버튼 1 ··· 4 5 6 7 8 9 이전버튼