socket unix domain IPC的实例代码

仅供参考:

服务端:socket->bind->listen->send/recv->close

客户端:socket->bind->connect->send/recv->close

  #include <sys/socket.h>   #include <sys/types.h>   #include <netinet/in.h>   #include <arpa/inet.h>   #include <errno.h>   #include <fcntl.h>   #include <sys/un.h>   #include <pthread.h>   #include <cstring>   #include <cstdio>   #include <unistd.h>   #include <signal.h>      #define filename "test.socket"      void setnonblocking(int fd)   {     fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);   }      void *client_func(void *arg)   {     sleep(3);     int fd = socket(AF_UNIX, SOCK_STREAM, 0);     setnonblocking(fd);     sockaddr_un un;     memset(&un, 0, sizeof(un));     un.sun_family = AF_UNIX;     sprintf(un.sun_path, "file_%d.socket", (int)getpid());     unlink(un.sun_path);     socklen_t len = sizeof(un);     bind(fd, (sockaddr *)&un, sizeof(un));     strcpy(un.sun_path, filename);     int ret = connect(fd, (sockaddr *)&un, len);     if (ret == -1)     {       printf("connect server failed...n");       close(fd);       return NULL;     }     char buf[256];     memset(buf, 0, sizeof(buf));     strcpy(buf, "hello world");     int n = send(fd, buf, strlen(buf)+1, 0);     printf("send data, %d bytes..n", n);     sleep(5);     close(fd);        return NULL;   }      int main()   {     unlink(filename);       signal(SIGPIPE, SIG_IGN);     int fd = socket(AF_UNIX, SOCK_STREAM, 0);     int yes = 1;     setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));     setnonblocking(fd);     sockaddr_un un;     memset(&un, 0, sizeof(un));     un.sun_family = AF_UNIX;     strcpy(un.sun_path, filename);     bind(fd, (sockaddr *)&un, sizeof(un));     listen(fd, 100);          pthread_t pid;     pthread_create(&pid, NULL, client_func, NULL);        sockaddr_un uu;     socklen_t len = sizeof(uu);      while (true)     {       memset(&uu, 0, len);       int newfd = accept(fd, (sockaddr *)&uu, &len);        if (newfd != -1)       {         setnonblocking(newfd);         printf("newfd = %d, path = %sn", newfd, uu.sun_path);         char buf[512];         memset(buf, 0, sizeof(buf));         int n = recv(newfd, buf, 512,0);         printf("recv %d bytes, contents is %sn", n, buf);       }       usleep(100000);     }          close(fd);        return 0;   } 

以上就是小编为大家带来的socket unix domain IPC的实例代码全部内容了,希望大家多多支持脚本之家~

参与评论