UDP Sockets

 

Ø Basic UDP Client and Server

Ø Displaying Destination Address

Ø Connected UDP Clients

Ø Reliability of  UDP

Ø Big Packets

Ø Select UDP and TCP

 

 

 


Ø   Basic UDP Client and Server:

 

 

·       Server:  udpserv01  ( it uses  dg_echo )

 

·       Client:  udpcli01     ( it uses  dg_cli )

 

·       udpcli03  displays sender IP and port (it uses dgcliinetaddr.c) 

 

n = Recvfrom(sockfd, recvline, MAXLINE, 0, (SA *) replyaddr, &len);
 
printf("received reply from %s, port %d\n", 

                         inet_ntoa(replyaddr->sin_addr), htons(replyaddr->sin_port));

To test:

 

% cd ~/stevens3rd.book/unpv13e/udpcliserv


% udpserv01   &


% udpcli01  127.0.0.1 
Hi
Hi
^D


% udpcli03   127.0.0.1
Hi
received reply from 127.0.0.1, port  10111
Hi
^D

 


 

Ø    Displaying Destination Address:

 

 

msgHeader

 

·       Example: udpserverDaddr.c 

 

 i = 1;

 setsockopt (echo_s, IPPROTO_IP, IP_RECVDSTADDR, (char *)&i, sizeof(i));

 

 recvmsg (echo_s, &mhdr, MSG_DONTWAIT));

         

 for  (cmptr = CMSG_FIRSTHDR(&mhdr); cmptr != NULL;

                 cmptr = CMSG_NXTHDR(&mhdr, cmptr)) {

 

        if (cmptr->cmsg_level == IPPROTO_IP &&

      cmptr->cmsg_type ==  IP_RECVDSTADDR) {

 

               memcpy(&ip_addr, CMSG_DATA(cmptr), sizeof(struct in_addr));

 

               printf("udp message sent  to: %s\n",  

                      inet_ntop (AF_INET, &ip_addr, str, sizeof(str)));

 

}

  }

 

 

To test:

 

·       Server:

% cd   ~/stevens3rd.book/unpv13e/udpcliserv

%  udpServerDaddr 10111 224.0.0.1

udp message sent  to: 224.0.0.1

udp message sent  from: 128.82.4.19:44617

received:KKKK

 

·       Client:

% cd   ~/stevens3rd.book/unpv13e/udpcliserv
% udpcli03 224.0.0.1

KKKK

received reply from 128.82.4.19, port 10111

KKKK

 

 

 

 

 

 


Ø    Connected UDP Clients:

 

·       Client: udpcli04 (it uses dgcliconnect.c)

 

For a connected udp socket:

You can use read/write instead of  sendto/recvfrom

 

·       Server: you can use udpserv01.c

 

 

To test:

 

% cd ~/stevens3rd.book/unpv13e/udpcliserv
% udpserv01   &
% udpcli04  127.0.0.1 
Hi
Hi
^D

 

% udpcli04   128.82.4.120
Hi

read error: Connection refused

 

Why? Because there is no server is running at 28.82.4.120!

 

This error is reported only to connected upd sockets

but not for unconnected udp sockets.

 

% sudo tcpdump -N -t | grep 10111

IP something.40498 > somethingelse.10111: UDP,length 3

IP somethingelse > something: ICMP somethingelse udp port 10111 unreachable, length 39



·        Client: udpcli09.c displays the local & peer ip/port information even there is no server running!



 

 


Ø    Reliability of UDP:

 

·       Client:  udpcli06    (it uses dgcliloop1.c)

 sends 2000 packets to server.

 

·       Server:  udpserv06  (it uses dgecholoop1.c)

which receive some, but may not all, the 2000 packets.


OR

 

·       Server:  udpserv07  (it uses dgecholoop2.c)

which receive more,   but may not all, the 2000 packets,   

 by increasing   socket RCVBUF:

 

n = 240 * 1024;
Setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n));

 

 

To test:

 

% cd   ~/stevens3rd.book/unpv13e/udpcliserv
% udpserv07  

     interrupt me


% udpcli06  127.0.0.1 

   (run before and after interrupt me)

 

 


Ø    Big Packets:

 

·       Client:   udpcli10     (it uses dgclibig.c)

 

·       Server:  udpserv10  (it uses dgservbig.c)


 Risk! loosing the packet because of fragmentation.

 

 

 

 


Ø    Select UDP and TCP:

 

·       Server:  udpservselect01.c  

Used to serve UDP & TCP clients.

 

·       Client: 

Use any, e.g.,  udpcli01 tcpcli01