An example of UNIX domain user datagram socket

Service-Terminal:

 1: #include <stdio.h>
 2: #include <stdlib.h>
 3: #include <strings.h>
 4: #include <sys/un.h>
 5: #include <string.h>
 6: #include <sys/socket.h>
 7: #include <netinet/in.h>
 8: #include <arpa/inet.h>
 9: #include <unistd.h>
10: 
 11: typedef struct sockaddr SA;
12: 
 13: #define N 256
 14: 
 15: int main(int argc, char *argv[])
 16: {<!-- -->
 17: 
 18: int listenfd;
 19: struct sockaddr_un myaddr, peeraddr;
 20: socklen_t peerlen = sizeof(peeraddr);
 21: char buffer[N];
 22: 
 23: if(argc < 2)
 24: {<!-- -->
 25: printf("usage:%s <sock file>\\
",argv[0]);
 26: exit(-1);
 27: }
 28: 
 29: if((listenfd = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0)
 30: {<!-- -->
 31: perror("fail to socket");
 32: exit(-1);
 33: }
 34: 
 35: bzero( & amp;myaddr, sizeof(struct sockaddr_un));
 36: 
 37: myaddr.sun_family = PF_UNIX;
 38: strcpy(myaddr.sun_path, argv[1]);
 39: 
 40: remove(argv[1]);
 41: if(bind(listenfd, (SA *) & amp;myaddr, sizeof(myaddr)) < 0)
 42: {<!-- -->
 43: perror("fail to bind");
 44: exit(-1);
 45: }
 46: 
 47: bzero( & amp;peeraddr, peerlen); 
48: 
 49: while(1)
 50: {<!-- -->
 51: recvfrom(listenfd, buffer, N, 0, (SA *) & amp;peeraddr, & amp;peerlen);
52: 
 53: printf("receive from client [%s]> %s",peeraddr.sun_path, buffer); 
 54: sendto(listenfd, buffer, N, 0, (SA *) & amp;peeraddr, sizeof(peeraddr)); 
 55: }
56: 
 57: return 0;
 58: }

Client:

 1: #include <string.h>
 2: #include <stdio.h>
 3: #include <stdlib.h>
 4: #include <strings.h>
 5: #include <sys/un.h>
 6: #include <sys/socket.h>
 7: #include <netinet/in.h>
 8: #include <arpa/inet.h>
 9: #include <unistd.h>
10: 
 11: typedef struct sockaddr SA;
12: 
 13: #define N 256
 14: 
 15: int main(int argc, char *argv[])
 16: {<!-- -->
 17: 
 18: int sockfd;
 19: struct sockaddr_un myaddr,serveraddr;
 20: char buffer[N];
 21: 
 22: if(argc < 3)
 23: {<!-- -->
 24: printf("usage:%s <server sock> <client sock>\\
",argv[0]);
 25: exit(-1);
 26: }
 27: 
 28: if((sockfd = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0)
 29: {<!-- -->
 30: perror("fail to socket");
 31: exit(-1);
 32: }
 33: 
 34: bzero( & amp;myaddr, sizeof(struct sockaddr_un));
35: 
 36: myaddr.sun_family = PF_UNIX;
 37: strcpy(myaddr.sun_path, argv[2]);
 38: 
 39: unlink(argv[2]);
 40: if(bind(sockfd, (SA *) & amp;myaddr, sizeof(myaddr)) < 0)
 41: {<!-- -->
 42: perror("fail to bind");
 43: exit(-1);
 44: }
45: 
 46: 
 47: bzero( & amp;serveraddr, sizeof(struct sockaddr_un));
48: 
 49: serveraddr.sun_family = PF_UNIX;
 50: strcpy(serveraddr.sun_path, argv[1]);
51: 
 52: while(1)
 53: {<!-- -->
54: 
 55: fgets(buffer, N ,stdin);
 56: if(strncmp(buffer, "quit", 4) == 0)
 57: {<!-- -->
 58: break;
 59: }
60: 
 61: sendto(sockfd, buffer, N, 0, (SA *) & amp;serveraddr, sizeof(serveraddr));
 62: bzero(buffer, N);
 63: recvfrom(sockfd, buffer, N, 0, NULL, NULL);
 64: 
 65: printf("receive from server: %s", buffer);
 66: }
 67: 
 68: close(sockfd);
 69: return 0;
 70: }

Run:

Server:

image

Client:

image