使用Unix域套接字实现进程间通讯

发布于 2022-07-18 06:00:33 字数 5808 浏览 7 评论 0

闲了整理了一下以前用到的例子,贴出来与大伙分享一下^_^

  1. /*
  2. domain_socket.h
  3. @Author: duanjigang @2006-4-11
  4. @Desp: declaratin of methods used for unix-domain-socket communication
  5. */
  6. #ifndef _H_
  7. #define _H_
  8. #include <stdio.h>
  9. #include <unistd.h>
  10. #include <sys/un.h>
  11. #include <sys/socket.h>
  12. #define MSG_SIZE 1024
  13. int init_send_socket(struct sockaddr_un * addr,char * path)
  14. {
  15.         int sockfd,len;
  16.         sockfd=socket(AF_UNIX,SOCK_DGRAM,0);
  17.         if(sockfd<0)
  18.         {
  19.                 exit(1);
  20.         }
  21.         bzero(addr,sizeof(struct sockaddr_un));
  22.         addr->sun_family=AF_UNIX;
  23.         strcpy(addr->sun_path,path);
  24.         return sockfd;
  25. }
  26. int init_recv_socket(char * path)
  27. {
  28.         int sockfd,len;
  29.         struct sockaddr_un addr;
  30.         sockfd=socket(AF_UNIX,SOCK_DGRAM,0);
  31.         if(sockfd<0)
  32.         {
  33.            return -1;
  34.         }
  35.         bzero(&addr,sizeof(struct sockaddr_un));
  36.         addr.sun_family = AF_UNIX;
  37.         strcpy(addr.sun_path, path);
  38.         unlink(path);
  39.         len = strlen(addr.sun_path) + sizeof(addr.sun_family);
  40.         if(bind(sockfd,(struct sockaddr *)&addr,len)<0)
  41.          {
  42.           return -1;
  43.          }
  44.         return sockfd;
  45. }
  46. int receive_from_socket(int sockfd, char msg[])
  47. {
  48.       int n;
  49.       memset(msg, 0, MSG_SIZE);
  50.       n=recvfrom(sockfd, msg, MSG_SIZE, 0, NULL, NULL);
  51.       if(n<=0)
  52.       {
  53.        return -1;
  54.       }
  55.       msg[n]=0;
  56.       return n;
  57. }
  58. int send_to_socket(int sockfd, char msg[], const struct sockaddr_un * addr)
  59. {
  60.         int len;
  61.         len = strlen(addr->sun_path)+sizeof(addr->sun_family);
  62.         sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr*)addr,len);
  63.         return 1;
  64. }
  65. #endif

复制代码
一个调用的例子

  1. /*
  2. main.c
  3. @Author: duanjigang @ 2006-4-11
  4. @Desp: Two processes communicate with unix domain socket
  5. */
  6. #include "domain_socket.h"
  7. #define PATH "/home/useless"
  8. /*
  9. 进程间通过域进行通讯-举例:父子进程,一个发送,一个接收
  10. */
  11. int main(void)
  12. {
  13.   int pid;
  14.   /*
  15.   子进程用于发送消息
  16.   */
  17.   if((pid = fork()) == 0)
  18.   {
  19.     int fd, counter = 0;
  20.     char send_buffer[MSG_SIZE];
  21.     struct sockaddr_un addr;
  22.    if( (fd = init_send_socket(&addr, PATH)) > 0)
  23.     while(1)
  24.     {
  25.        memset(send_buffer, 0 , MSG_SIZE);
  26.        /*
  27.            防止计数器越界,所以做一个复位判断
  28.            */
  29.            sprintf(send_buffer,"message for %d times",
  30.        counter++ >= 10000 ? 1 : counter);
  31.        send_to_socket(fd, send_buffer, &addr);
  32.        printf("Sender: %sn", send_buffer);
  33.        sleep(1);
  34.     }
  35.   }/*
  36.    父进程用于接收消息
  37.   */
  38.   else
  39.   {
  40.       int fd;
  41.       char recv_buffer[MSG_SIZE];
  42.       if( (fd = init_recv_socket(PATH))> 0)
  43.       while(1)
  44.       {
  45.        memset(recv_buffer, 0, MSG_SIZE);
  46.        if(receive_from_socket(fd, recv_buffer))
  47.        {
  48.         printf("Receiver: %sn", recv_buffer);
  49.        }
  50.       }
  51.   }
  52. }

复制代码
[ 本帖最后由 duanjigang 于 2006-4-11 17:13 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文