본문 바로가기
Server | Network

네트워크 소켓프로그래밍 일반(Network Socket Programming Guide)

by 두루물 2011. 1. 27.

(예전에 정리해 놓은것 하드 뒤적거리다가 발견해서 올림)
___________________________________________________________________

  네트워크 소켓프로그래밍 일반(Network Socket Programming Guide)
___________________________________________________________________
-------------------------------------------------------------------
[!] BSD계열의 Internet 프로토콜을 기반으로 한내용이다.

소켓을 구현하고자하는 Process는 동작 형태에 따라서 Server,Client로
뷴류되고 프로토콜 형태에 따라서 연결지향인 TCP(가상회선을 이용하여
항상 연결이 되어 있는것처럼 한다),비연결형인 UDP로 구분될수 있다.
소켓API는 표준화를 따르므로 o.s플랫폼에 상관없이 서로 이식가능하다.

Server:요청한 일을 처리하거나 요청을 기다리는 프로세스나 컴퓨터
       예) 은행창구 직원
       
Client:서버의 기능을 사용하여 결과를 얻고자하는 프로세스나 컴퓨터

       예) 은행고객

[그림] 연결지향 프로토콜(TCP)의 소켓동작의 예

       <Server>
      +---------+
      |socket() |
      +---------+
      |bind()   |
      +---------+
      |listen() |                 <Client>   
      +---------+               +----------+
      |accept() |               | socket() |
      +---------+               +----------+
      |   .     |               |          |
      |         |               +----------+
      |   .     |<------------- | connect()|
      +---------+               +----------+
      |read()   |<------------- | write()  |
      +---------+               +----------+
      |   .     |               |          |
      |   .     |               |          |
      +---------+               +----------+
      |write()  | ------------> | read()   |
      +---------+               +----------+
      |close()  |               | close()  |
      +---------+               +----------+

   - 설명:Server 는 먼저 수행되어 있고 client의 요청(연결요청)
          이 있을때까지 accept()에서 리턴되지 않는다.
          client가 Server가 bind한 port로 connect를 시도한다.
          연결이 되면 Server의 accept()에서 빠져나오며
          read()상태에 들어간다.
          client가 write()한후 네트워크 속도와관련되어 Server가
          이것을 read()한후 사용자처리를 한후 write()로
          client에 전송하게 된다.
          accept()이후부분은 보통 fork()를 수행한 child Server가
          업무처리를 하게 하고 Parent는 중개역할만 담당한다.


[그림] 비연결 프로토콜(UDP)의 소켓동작의 예

       <Server>
      +----------+
      |socket()  |
      +----------+
      |bind()    |                 <Client>
      +----------+               +-----------+
      |recvfrom()|               | socket()  |
      +----------+               +-----------+
      |   .      |               | bind()    |
      +----------+               +-----------+
      |   .      |<------------- | sendto()  |
      +----------+               +-----------+
      |sendto()  | ------------> | recvfrom()|
      +----------+               +-----------+
      |close()   |               | close()   |
      +----------+               +-----------+

Association(주소 연계)
   상대방 호스트와 통신하기위해 기본적으로 필요한 정보 즉,
   프로토콜과 인터넷주소,포트 등을 모두 포함하여 실제적으로
   통신이 가능하도록 5개의 항목으로 연계를 구성한다.

   {프로토콜,Local Host주소,Local Port,Remote Host주소,Remote Port}

   예>{TCP,210.106.81.35 2002,203.236.117.74,2002}


-Socket Address Structure(소켓주소구조체)

 소켓api함수에서 사용되는 구조체이다.

 #include <netinet/in.h>
 struct in_addr{
     u_long          s_addr;//32bit network byte order(big endian)
     };


 #include <sys/socket.h>
 struct sockaddr{
     u_short         sa_family;   //주소군
     char            sa_dat[14];  //주소관련내용
     };

  >sockaddr_in와 크기가 같으며(16bytes) 해당내용도 같다.
  >sa_family = AF_UNIX
               AF_INET (Internet 규약)
               AF_NS
               AF_IMPLINK


 #include <netinet/in.h>
 struct sockaddr_in{
     short           sin_family;
     u_short         sin_port;     //포트번호
     struct in_addr  sin_addr;     //32비트 인터넷주소
     char            sin_zero[8];  //예약
     };

 통신규약을 설정한다.
 주소연계중 프로토콜을 지정하는역할
 int socket(int family,int type,int protocol);
    family : AF_INET
    type   : 소켓의 Type을 지정한다
             SOCK_STREAM    연결형소켓
             SOCK_DGRAM     비연결형 udp소켓
             SOCK_RAW
             SOCK_SEQPACKET
             SOCK_RDM

  소켓에 주소와 포트를 부여한다.
  주소연계중 Local의 주소와 포트를 지정하는역할
  int bind(int sockfd,struct sockaddr *myaddr,int addrlength);

E.A.S.T.W.O.O.D Nonstop Quasar KimKyungRae 1998.

(예전에 정리해 놓은것 하드 뒤적거리다가 발견해서 올림)