我在同一系统上有2个需要来回通信的应用程序。根据我的研究,我认为这称为“进程间通信”,而使用socketpair()是解决我的问题的最佳方法。

我正在努力(从字面上看)试图开始使用C中的socketpair()创建套接字。据我所知,套接字是一个非常复杂的主题,而我作为C的新手程序员肯定对这种情况没有帮助。

我在过去的48小时内用Google搜索,阅读了教程等,但仍然无法获取。我理解这个概念,但是代码太困惑了。我已经读过几次这篇文章:http://beej.us/guide/bgnet/html/single/bgnet.html,但这还不够简单。

有人可以提供一些示例(五年级学生可以这么简单地理解)还是可以为我提供一个很好的教程?

最佳答案

您只能在创建两个进程的地方都使用socketpair,如下所示:

  • 调用socketpair-现在您有两个套接字文件描述符(单个管道的两端)
  • 提名一端为父端,另一端为子端。无关紧要,只是做出选择并在以后坚持使用
  • 调用fork-现在您有两个过程
  • 如果fork返回零,则您是 child 。关闭父文件描述符,保留子描述符,并将其用作管道
  • 的此过程的结尾
  • 如果fork返回的非零值,则说明您是父级。关闭子文件描述符,保留父文件描述符,并将其用作管道的结尾
  • 现在您有两个进程,每个进程都有一个文件描述符,它们表示同一管道的不同末端。请注意,两个进程都运行相同的程序,但是在调用fork之后,它们遵循不同的分支。如果父级在其套接字上调用write,则子级将能够从其套接字读取该数据,反之亦然

  • 这是直接翻译成代码:
    void child(int socket) {
        const char hello[] = "hello parent, I am child";
        write(socket, hello, sizeof(hello)); /* NB. this includes nul */
        /* go forth and do childish things with this end of the pipe */
    }
    
    void parent(int socket) {
        /* do parental things with this end, like reading the child's message */
        char buf[1024];
        int n = read(socket, buf, sizeof(buf));
        printf("parent received '%.*s'\n", n, buf);
    }
    
    void socketfork() {
        int fd[2];
        static const int parentsocket = 0;
        static const int childsocket = 1;
        pid_t pid;
    
        /* 1. call socketpair ... */
        socketpair(PF_LOCAL, SOCK_STREAM, 0, fd);
    
        /* 2. call fork ... */
        pid = fork();
        if (pid == 0) { /* 2.1 if fork returned zero, you are the child */
            close(fd[parentsocket]); /* Close the parent file descriptor */
            child(fd[childsocket]);
        } else { /* 2.2 ... you are the parent */
            close(fd[childsocket]); /* Close the child file descriptor */
            parent(fd[parentsocket]);
        }
        exit(0); /* do everything in the parent and child functions */
    }
    

    请注意,这只是示例代码:我省略了所有错误检查和明智的流协议(protocol)。

    如果您希望两个单独的程序进行通信(例如,您有一个称为客户端的可执行文件,而一个名为服务器的可执行文件),则不能使用此机制。相反,您可以:
  • 使用UNIX套接字(其中一台主机上的IPC管道由文件名标识-仅在客户端和服务器在同一台计算机上运行时才有效)
  • 或使用TCP/IP套接字(其中IP地址和端口标识管道,并且客户端和服务器可以在不同的计算机上)


    如果您不需要插槽,并且很高兴要求客户端和服务器在同一台计算机上运行,​​则还可以使用共享内存或消息队列。

    10-05 19:14