Preface Introduction:
1. UNIX domain sockets, compared to TCP sockets, transmit four degrees to the same host twice times the latter
2.UNIX domain sockets can pass descriptors between processes on the same host
The difference between a 3.UNIX domain socket and a traditional socket is a description of the protocol family using the pathname.
UNIX Domain Address structure
#define Unix_path_max 108struct sockaddr_un{ sa_family_t sun_family; /* Af_unix* * Char Sun_path[unix_path_max]; /* Pathname */ }
Now let's write a simple back-up server to Practice
#include <stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<errno.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/inch.h>#include<arpa/inet.h>#include<sys/un.h>#defineErr_exit (M) Do{perror (M); Exit (Exit_failure); } while(0)voidEcho_srv (intconn) { Charrecvbuf[1024x768]; intret; while(1) {memset (Recvbuf,0,sizeof(RECVBUF)); RET= Read (conn, recvbuf,1024x768); if(Ret ==-1) { if(errno = =eintr)Continue; Err_exit ("Read"); }Else if(ret = =0) {close (conn); printf ("Client close\n"); } fputs (Recvbuf, stdout); Write (conn, recvbuf, ret); }intMainintargcConst Char*argv[]) { //use UNIX domain sockets, which are different from TCP when requesting sockets//need to use a Pf_unix macro instead of Pf_inet intLISTENFD = socket (Pf_unix, Sock_stream,0); if(LISTENFD <0) Err_exit ("SoCKET"); structSockaddr_un servaddr; memset (&SERVADDR,0,sizeof(SERVADDR)); Servaddr.sun_family=Af_unix; strcpy (Servaddr.sun_path,"Test_socket"); if(Bind (LISTENFD, (structsockaddr*) &servaddr,sizeof(SERVADDR)) <0) Err_exit ("Bind"); if(Listen (LISTENFD, Somaxconn) <0) Err_exit ("Listen"); intConn; pid_t pid; while(1) {Conn=Accpet (LISTENFD, NULL, NULL); if(conn = =-1) { if(errno = =eintr)Continue; Err_exit ("Accept"); } PID=Fork (); if(PID = =-1) Err_exit ("Fork"); if(PID = =0) {close (LISTENFD); ECHO_SRV (conn); Exit (exit_success); }Else if(PID >0) {close (conn); } } return 0}
Attention:
1.bind success will create a file with permissions of 0777, & umask = 755
2.sun_path better use an absolute path
3.UNIX domain protocol supports streaming sockets and report-style sockets
4.UNIX and streaming sockets connect will immediately return a econnrefused when the listener queue is full, which differs from TCP
If the listening queue is full, the incoming SYN is ignored, which causes the other party to retransmit the SYN;
Linux Learning: UNIX domain protocol