2009년 11월 4일 수요일

[study] 1.윈속에 대한 소개_microsoft WINDOWS(Anthony Jones & Jim Ohlund) Network

NETWORK PROGRAMMING for microsoft WINDOWS(Anthony Jones & Jim Ohlund)

 

윈속의 헤더와 라이브러리

 일반적으로 새로 응용프로그램을 개발하고자 한다면 WINSOCK2.H를 include 하여 윈속2로 개발한다.

 이 때 WS2_32.LIB 파일을 링크시켜야 한다.

만일 MSWSOCK.H의 확장 API를 사용한다면 MSWSOCK.LIB를 추가로 링크시켜야 한다.

 

윈속 초기화

윈속 라이브러리의 로드 :

 

 int WSAStartup (

         WORD wVersionRequested,              // 로드 하기를 윈하는 윈속 라이브러리의 버전

         LPWSADATA lpWSAData                    //  로드된 라이브러리에 대한 정보가 리턴

);

 

에러 검출과 처리 (Error Checking and Handling)

대부분의 윈속 함수는 에러 발생시 SOCKET_ERROR를 리턴한다.

SOCKET_ERROR의 실제 값 = -1

윈속 함수를 호출하고 에러를 리턴 받았다면 WSAGetLastError 함수를 호출 -> 어떤 원인에 의하여 에러가 발생되었는지 확인!

        int   WSAGetLastError(void);             // 해당 에러에 대한 코드값 리턴

프로토콜의 주소 지정(Addressing a Protocol)

인터넷 프로토콜(IP, Internet Protocol).

IP는 대부분의 OS에서 사용이 가능하고 대부분의 LAN(Local Area Network)과 WAN(Wide Area Network)에서 사용하고 있다.

TCP와 UDP는 IP 기반의 프로토콜로서 TCP/IP와 UDP/IP라고 부르기도 한다.

이 장에서는 IPv4만을 다룬다.

소켓 생성

윈도우 플랫폼에서는소켓이 파일 디스크립터와 다르며 WINSOCK2.H의 SOCKET은 파일 디스크립터와 전혀 다른 형식으로 정의되어 있다.

           SOCKET  socket (

                         int af,                       // 프로토콜의 어드레스 패밀리 (AF_INET)

                         int type,                  // 프로토콜의 소켓 타입

                         int protocol           // 프로토콜을 지정하는 필드

);

연결 지향 통신(Connection-Oriented Communication)

TCP/IP를 통하여 이루어 진다. TCP는 신뢰성 있는 데이터 전송을 제공한다.

서버측 API 함수들

 

Winsock Server :   socket() / WSASocket()  -> bind()  ->  listen()   -> accept() / WSAAccept()

Winsock Client :    socket() / WSASocket()  ->  Address resolution  -> connet() / WSAConnect()

 

*바인딩(Binding)

             int  bind (

                      SOCKET                           s,                       // 클라이언트의 연결을 기다릴 소켓

                      const  struct  sockaddr  FAR*  name,   // 프로토콜에 해당하는 구조체 값을 채운 후 sockaddr의 포인터로 형변환  입력

                      int                                        namelen        // 두번째 파라메터로 입력된 프로토콜의 구조체의 크기

            );

 

 - 호출할 때 에러가 발생되면 SOCK_ERROR를 리턴한다. bind 호출 시 발생되는 일반적인 에러는 WSAEADDERINNUSE이다.

 

*연결 대기(listening)

           int   listen (

                    SOCKET        s,               // 바인드 된 소켓

                    int  backlog                      // 들어오는 연결을 대기시킬 수 있는 최대 개수

          );

 

*연결 수락(Accept Connections)

          SOCKET   accept (

                        SOCKET    s,                                 // 연결 대기 모드에 잇는 소캣

                        struct sockaddr  FAR* addr,       // 구조체 SOCKADR_IN의 주소

                        int FAR*  addrlen                         // 구조체 SOCKADR_IN의 길이의 주소값

          );

 

*연결 (Connect)

            int  connect (

                    SOCKET    s,                                                 // 연결하기를 원하는 소켓

                    const  struct  sockaddr   FAR*  name,      // 연결할 서버의 주소를 담을 구조체

                    int   namelen                                                 // name 변수의 크기

            );

 

*데이터 전송

           int   send (

                      SOCKET   s,                         // 데이터를 전송하길 우너하는 연결된 소켓

                      const   char   FAR*   buf,     // 전송할 데이터가 담긴 char 형 버퍼

                      int    len,                                // 전송할 데이터의 크기

                      int    flags

           );

 

          int   recv (

                   SOCKET    s,                        // 데이터를 수신할 소켓

                   char FAR*  buf,                    // 수신된 데이터를 담을 char형 버퍼

                   int    len,                                // 수신하길 우너하는 크기, 혹은 버퍼의 크기

                   int   flags

         );

 

*연결 종료

         int   shutdown  (

                   SOCKET     s,                      

                   int   how                              // SD_RECEIVE, SD_SEND, SD_BOTH 중에 하나의 값을 가진다.

         );

댓글 없음:

댓글 쓰기