2. Contents
recvfrom and sendto Function
UDP Echo Server( main, de_echo Function)
UDP Echo Client( main, de_cli Function)
Lost datagrams
Verifying Received Response
Sever not Running
Connect Function with UDP
Lack of Flow Control with UDP
Determining Outgoing Interface with UDP
TCP and UDP Echo Server Using select
3. 8.1 Introduction
connectionless
unreliable
datagram protocol
popular using
DNS(the Domain Name System)
NFS(the Network File System)
SNMP(Simple Network Management Protocol)
4. UDP Server
socket( )
bind( )
UDP Client
socket( ) recvfrom( )
block until datagram
sendto( ) received from a client
data(request)
Process request
recvfrom( ) data(reply) sendto( )
close( )
Socket functions for UDP client-server
5. 8.2 recvfrom and sendto Functions
#include<sys/socket.h>
ssize_t recvfrom(int sockfd, void *buff, size_t nbyte, int flag,
struct sockaddr *from, socklen_t *addrlen);
ssize_t sendto(int sockfd, const void *buff, size_t nbyte, int flag,
const struct sockaddr *to, socklen_t addrlen);
Both return: number of bytes read or written if OK,-1 on
error
6. 8.3 UDP Echo Server: main Function
fgets sendto recvfrom
stdin UDP UDP
stdout client server
fputs recvfrom sendto
Simple echo client-server using UDP
UDP echo server #include “unp.h”
int main(int argc, char **argv)
{
int sockfd;
struck sockaddr_in servaddr,cliaddr;
sockfd=Socket(AF_INET,SOCK_DGRAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_fammily=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERV_PORT);
bind(sockfd, (SA *) &servaddr,sizeof(servaddr));
dg_echp(sockfd, (SA *) &cliaddr,sizeof(cliaddr));
}
7. 8.4 UDP Echo Server:dg_echo Function
#include “unp.h”
void dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
{
int n;
socklen_t len;
char mesg[MAXLINE];
for( ; ; ) {
len=clilen;
n=Recvfrom(sockfd, mseg, MAXLINE, 0, pcliaddr, &len);
sendto(sockfd, mesg, n, 0, pcliaddr, len);
}
}
dg_echo funtion: echo lines on a datagram socket.
8. 1.This function never
terminates.
2.This function provides an iterative, not a concurrent
server as we had with
TCP
connection server fock listening fock server connection
client child client
child server
TCP TCP TCP
connection connection
Summary of TCP client-server with two clients.
9. client server client
Socket receive
buffer
UDP UDP
UDP
datagram datagram
Summary of UDP client-server with two clients.
12. 8.7 Lost Datagrams
If the client datagram arrives at the server
but the server’s reply is lost, the client will
again block forever in its call to recvfrom.
The only way to prevent this is to place a
timeout on the recvfrom.
13. 8.8 Verify Received Response
#include “unp.h”
void dg_cli(FILE *fp, int sock, const SA *pseraddr, socklen_t servlen)
{
int n;
char sendline[MAXLINE], recvline[MAXLINE];
socklen_t len;
struct sockaddr *preply_addr;
preply_addr = Malloc(servlen);
while(Fget(sendline, MAXLINE, fp) ! = NULL) {
Sendto(sockfd,sendline, strlen(sendline), 0, pservaddr, servlen);
len = servlen;
n = Recvfrom(sockfdm, recvline, MAXLINE, 0, preply_addr,&len)
continue
14. If(len != servlen || memcmp(pservaddr, preply_addr, len) != 0) {
printf(“reply from %s (ignore)n”,
Sock_ntop(preply_addr, len);
continue;
}
recvline[n] = 0; /*NULL terminate */
Fputs(recvline, stdout);
}
}
Version of dg_cli that verifies returned socket address.
Bsdi.kohala.com has address 206.62.226.35
Bsdi.kohala.com has address 206.62.226.66
Solaris % udpcli02 206.62.226.66 The server has not bound an IP address
hello to its socket, the kernel choose the source
reply from 206.62.226.35.7 (ignore) address for the IP datagram. It is chosen
goodbye to be the primary IP address of the outgoing
reply from 206.62.226.35.7 (ignore) interface.
15. 8.9 Server Not Running
Client blocks forever in the call to recvfrom.
ICMP error is asynchronous error.
The basic rule is that asynchronous errors are not
returned for UDP sockets unless the socket has
been connected.
16. 8.11 connect Function with UDP
This does not result in anything like a TCP
connection: there is no three-way handshake.
Instead, the kernel just records the IP address and
port number of the peer.
With a connect UDP socket three change:
1. We can no long specify the destination IP address
and port for an output operation. That is, we do not
use sendto but use write or send instead.
2. We do not use recvfrom but read or recv
instead.
17. 3. Asynchronous errors are returned to the process for a
connected UDP socket.
application peer
???
UDP } Stores peer IP address
and port#from connect
UDP
UDP datagram
UDP datagram from
some other
IP address and/or port# UDP datagram
18. Datagrams arriving from any other IP address or port are not
passed to the connected socket because either the source
IP address or source UDP port does not match the protocol
address to which the socket is connected.
DNS
DNS DNS DNS
clien
client server client
t
connect OK cannot connect cannot connect cannot connect
(configured to use
one server)
(configured to use
two server)
?
20. 8.13 Lack of Flow Control with UDP
#include “unp.h”
#define NDG 2000
#define DGLEN 1400
void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t, servlen)
{
int i;
char sendline[MAXLINE];
for(I = 0; I< NDG ; I++) {
Sendto(sockfd, sendline, DGLEN, 0, pservaddr, servlen);
}
}
dg_cli function that writes a fixed number of datagram to server
22. The interface’s buffers were full or they could have been
discarded by the sending host.
The counter “dropped due to full socket buffers” indicates how
many datagram were received by UDP but were discarded because
the receiving socket’s receive queue was full
The number of datagrams received b the server in this example is
nondeterministic. It depends on many factors, such as the network
load, the processing load on the client host, and the processing load
in the server host.
Solution
fast server, slow client.
Increase the size of socket receive buffer.
23. 8.14 Determining Outgoing Interface with UDP
This local address is chosen by searching the routing
table for the destination IP address, and then using the
primary IP address for the resulting interface.
N= 240 * 1024;
Setsockopt(sockfd, sol_SOCKET, so_RECVBUF, &n, sizeof(n));
Increases the size of the socket receive queue
24. Connect(sockfd,(SA *) &servaddr, sizeof(servaddr));
len = sizeof(cliaddr);
Getsockname(sockfd, (SA *) &cliaddr, &len);
printf(“local address &sn”,Soxk_ntop((SA *) &cliaddr, len);
exit(0);
Use connect to determine outgoing interface.
This local IP address is chosen by searching the routing table
for the destination IP address, and then using the primary IP
address for the resulting
25. 8.15 TCP and UDP Echo Server Using select
#include “unp.h”
int main(int argc, char **argv)
{
int listenfd, connfd, udpfd, nready, maxfd1;
char mesg[MAXLINE];
pid_t childpid;
fd_set rset;
ssize_t n;
socklen_t len;
const int on = 1;
struct sockaddr_in cliaddr, servaddr;
void sig_chld(int);