UDP –
Example – sending point to point messages
UDP allows
sending individual packets over the IP protocol (just process demultiplication is done) to different applications running
on different machines. Unlike TCP it does not support connections and streams. Each
sendto operation
needs to be
paired with a recvfrom.
UDP
client |
UDP
Server |
/* UDP client in the internet domain */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdio.h> void error(char *); int main(int argc, char *argv[]) { int sock, length,
n; struct sockaddr_in server, from; // IP Addressing(ip, port, type) Stuff struct hostent *hp; // DNS stuff char buffer[256]; if
(argc != 3) { printf("Usage: %s <server_name> <port>\n",argv[0]);
exit(1); } sock=
socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) error("socket"); server.sin_family = AF_INET; hp = gethostbyname(argv[1]); if
(hp==0) error("Unknown host"); bcopy((char *)hp->h_addr, (char *)&server.sin_addr,
hp->h_length); server.sin_port = htons(atoi(argv[2]));
length=sizeof(struct sockaddr_in); printf("Please enter the message: "); bzero(buffer,256); fgets(buffer,255,stdin); n=sendto(sock,buffer,strlen(buffer),0,&server,length); if (n < 0) error("Sendto"); n = recvfrom(sock,buffer,256,0,&from, &length); if (n < 0) error("recvfrom"); write(1,"Got an ack: ",12);
write(1,buffer,n); } void error(char *msg) { perror(msg); exit(0); } |
/* Creates a datagram server. The port number is
passed as an argument. This server runs
forever */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> void error(char *msg) { perror(msg); exit(0); } int main(int argc, char *argv[]) { int sock, length,
fromlen, n; struct sockaddr_in server; struct sockaddr_in from; char buf[1024]; if (argc < 2) { fprintf(stderr, "ERROR, no port
provided\n"); exit(0); }
sock=socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) error("Opening socket"); length = sizeof(server); bzero(&server,length); server.sin_family=AF_INET; server.sin_addr.s_addr=INADDR_ANY; server.sin_port=htons(atoi(argv[1]));
if (bind(sock,(struct sockaddr *)&server,length)<0) error("binding"); fromlen = sizeof(struct sockaddr_in); while (1) { n = recvfrom(sock,buf,1024,0,(struct sockaddr *)&from,&fromlen); if (n < 0) error("recvfrom"); write(1,"Received a datagram: ",21);
write(1,buf,n); n = sendto(sock,"Got your message\n",17,
0,(struct sockaddr *)&from,fromlen); if (n < 0) error("sendto"); } } |