Chapter 4 UDP 소켓사용법
개요 소켓이란 (Unix 소켓 ) 소켓의구조 소켓의유형 UDP 에대한이해 교재 Chapter 4.1 UDP 클라이언트 교재 Chapter 4.2 UDP 서버 교재 Chapter 4.3 UDP 소켓을이용한 송신및수신
소켓이란? Socket 은통신을위한끝점 (endpoint) 을생성하여파일에대한 open 과유사한방식으로기술자 (descriptor) 을반환한다. 소켓매개변수는인터넷도메인 (TCP/IP), Novell 의 IPX 또는 listen 과 accept 또는 select 를호출하여클라이언트는일반적으로 bind 와 connect 를호출한다. 유닉스도메인소켓 은실제네트워크프로토콜을나타내지는않으며, 다만동일머신상의소켓에접속할수있다. 표준유닉스에서는 1024 미만의.TCP 와 UDP 지역포트 (port) 넘버로의바인딩 (binding) 은루트권한을가져야하며모든프로세스는 1024 또는그이상의바인딩되어있지않은포트넘버에바인드할수있는것이보통이다.
소켓의구조소켓이라함은지역적으로한컴퓨터에서네트워크를통하여다른컴퓨터로의연결을이루게하여주는전달자의역할을담당한다. 이런전달자의역할을수행하기위해서소켓은켳가지데이터필드를포함하여야하며, 이는소켓이이루고있는기본구성요소가된다. (1) Family (2) Type (3) Protocol sin_len sin_len sin_family sin_port Local Socket Address sin_addr sin_zero sin_len sin_len sin_family sin_port Remote Socket Address sin_addr sin_zero 소켓구조체의구성
(1) Family 존재하는프로토콜그룹중의하나를선택하여어떤유형의프로토콜에따라소켓이진행될것인지를정해줄수있는필드이다. Family Protocol AF_UNIX AF_INET AF_INET6 AF_NS AF_ISO AF_IPX AF_APPLETALK 프로토콜상수설명 유닉스기본파일체계소켓 IPV4 IPV6 Xerox ISO Novell IPX Appletalk DOS Family 프로토콜상수
(2) Type 소켓은연결지향형 (SOCK_STREAM), 비연결형 (SOCK_DGRAM), 저수준프로토콜제어 (SOCK_RAW) 의세가지연결에대한 Type 을설정할수있다. 각각의타입에따라연결되는소켓의특징을결정한다. Type SOCK_STREAM SOCK_DGRAM SOCK_RAW 각 Type 상수게대한설명 TCP ( 스트림소켓 ) UDP ( 데이터그램소켓 ) RAW 소켓 소켓타입상수 (3) Protocol 기반전송기법이하나이상의프로토콜에서요청된소켓형태를제공하는경우에는소켓을위해특정프로토콜을선택할수있다. 일반적으로 Raw 소켓을제외하고는 0 으로설정된다.
소켓의유형 애플리케이션 Stream 소켓인터페이스 Datagram 소켓인터페이스 Raw 소켓 인터페이스 TCP TCP UDP UDP IP IP 물리물리계층과계층과데이터데이터링크링크계층
Stream 소켓 Stream 소켓은 TCP 를사용한연결형프로토콜이다. TCP 는인터넷을통해다른애프리케이션과의연결 (connect) 을위해한쌍의 Stream 소켓을사용한다. 따라서데이터의전송은원격지소켓과의연결후이루어진다. 우리의일상생활에서는전화의개념과비슷하다. Datagram 소켓 Datagram 소켓은 UDP 를사용한비연결형프로토콜이다. UDP 는인터넷을통해다른애플리케이션에게메시지를보내기위해한쌍의 Datagram 소켓을사용한다. TCP 와는달리연결과정이없기때문에보낼때마다도착지의주소가필요하다. 또한전송에대한신뢰성이없기때문에신뢰성을유지하기위해서는타임아웃을이용한적절한응답확인절차가필료하다. Datagram 에대한쉬운이해는우리생활에서편지와비슷하다. Raw 소켓 _bygin 새로운소켓을만들때사용 Raw 소켓은 ICMP(Internet Control Message Protocol) 또는 OSPF (Open Shortest Path First : 일종의라우팅프로토콜 ) 같은저수준의프로토콜을액세스할수있도록해준다. TCP 와 UDP 가아닌 IP 계층을직접이용한다. Raw 소켓은루트 (root) 만이쓸수있고, 새로운프로토콜을만들때사용하는소켓이다.
UDP(User Datagram Protocol) 다른계층의주소체계 ( 포트 ) 를 IP 계층위에추가하고전송중에발생할수있는데이터훼손을감지하고훼손된데이터그램을제거한다. 생성되자마자한 UDP 소켓은메시지들을어떤임의의주소로 / 주소로부터, 또이어서여러다른주소들로 / 주소들로부터송 / 수신하는데사용할수있다. UDP 가제공하는종단간전송서비스가최선형 (best effort) 이라는것이다. 즉 UDP 소켓에의해보내진한메시지가목적지에도착하는것에대한보장이없다. 이사실은 UDP 소켓을사용하는프로그램은메시지의유실이나순서바뀜에대한대비책이있어야한다는것을의미한다.
UDPEchoClient.c 소켓생성및설정 If ((sock = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) DieWithError( socket socket() failed ); 하나의에코데이터그램을보냄 memset(&echoservaddr,, 0, sizeof(echoservaddr)); echoservaddr.sin_family = AF_INET; echoservaddr.sin_addr.s_addr = inet_addr(servip); echoservaddr.sin_port = htons(echoservport);
If (sendto(sock( sendto(sock, echostring, echostringlen,, 0,(struct sockaddr *) &echoservaddr, sizeof(echoservaddr))!= echostringlen) DieWithError ( sendto () sent a different number of bytes than expected ); 에코응답을받고출력 1. 메시지받음 fromsize = sizeof(fromaddr); If ((respstringlen = recvfrom(sock, echobuffer,, ECHOMAX, 0, (struct sockaddr *) &fromaddr& fromaddr,, &fromsize& fromsize))!= echostringlen) DiewithError( recvfrom recvfrom() failed ); 2. 메시지발신지조사 If (echoservaddr.sin_addr.s_addr(!= fromaddr.sin_addr.s_addr) { fprintf(stderr, Error: received a packet from unknow source. n ); exit (1); } 3. 받은스트링인쇄 echobuffer [respstringlen]] = 0 ; Printf ( Received: %s n,% echobuffer);
UDPEchoServer.c 소켓생성및설정 상수의어떤값이라도수용 echoservaddr.sin_addr.s_addr = htonl(inaddr_any); Echoclient.c echoservaddr.sin_addr.s_addr = inet_addr(servip); 서버 IP 주소입력
for (;;) { cliaddrlen = sizeof(echocltaddr); if ((recvmsgsize = recvfrom(sock, echobuffer, ECHOMAX, 0, (struct( sockaddr *) &echoclntaddr, &cliaddrlen)) < 0) DieWithError( recvfrom recvfrom() failed ); printf( Handling client %s n,% inet_ntoa(echoclntaddr.sin_addr)); } if (sendto(sock( sendto(sock, echobuffer, recvmsgsize,, 0, (struct( sockaddr *) &echoclntaddr, sizeof(echoclntaddr))!= recvmsgsize) DieWithError( sendto sendto() sent a different number of bytes than expected );
UDP 소켓을이용한송신및수신 TCP 와 UDP 의중요한차이점 : UDP 는메시지경계를유지한다 - Client 에서 send to() 로송신한데이터는 server 에서 recvfrom() 으로받아서다시 client 로되돌려준다. 이것은 client 의주소를 sendto() 로송신하기때문에그주소를다시 recvfrom() 으로돌려준다. 즉서로다른 recvfrom() 의호출은 sendto() 로부터의호출이아닌각각의 sendto() 로부터데이터가반환된다 - UDP 소켓은연결을필요치않으므로여러다른메세지들이들어올수있는데, 이메세지들은 FIFO(first first-in in first- out) 의수신버퍼에저장되기때문에각각의메세지들을구분할수있는메시지경계가필요하다. 이것은발신지주소로써구분할수있다.
TCP 와는다르게 UDP 는오류회복기능이없다. -이것은 TCP 처럼버퍼에자료를저장하고나서보내는것이아니라 sendto() 가호출된시점에메시지전송을위해하부채널로넘겨져이미떠났다는것을말한다. - recvfrom() 가호출이되었을때, 충분히큰버퍼가잡혀있지않다면그이상의데이터들은수신측에아무런통지없이사라질것이다. - recvfrom() 으로부터반환될수있는최대데이터량 : 65,507 bytes 이것은하나의 UDP 에의해운반될수있는가장큰용량이다.