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"); } } |