首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C/Unix中的Socketpair()

C/Unix中的Socketpair()
EN

Stack Overflow用户
提问于 2012-07-13 05:39:24
回答 4查看 43.2K关注 0票数 38

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

我正绞尽脑汁(从字面上)开始尝试用C语言中的socketpair()来创建套接字。据我所知,套接字是一个非常复杂的话题,而我作为一个C程序员新手肯定对这种情况没有帮助。

我用谷歌搜索了过去的48小时,读了一些教程,等等,但我还是找不到。我理解这个概念,但是代码太混乱了。我已经读过这篇文章几次了:http://beej.us/guide/bgnet/html/single/bgnet.html,但它还不够简单。

有没有人能提供一些例子(简单到五年级学生都能理解),或者给我一个好的教程?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-13 05:54:56

您只能在创建这两个进程时使用socketpair,如下所示:

  1. 调用socketpair -现在您有了两个套接字文件描述符(单个管道的两端)
    • 指定一端作为父端,另一端作为子端。不管是哪一个,只要做出选择并坚持下去就行了later

  1. call fork -现在你有两个进程
    1. ,如果fork返回0,你就是子进程。关闭父文件描述符,保留子描述符,并将其用作此进程的管道末端
    2. 如果fork返回非零,则您就是父进程。关闭子文件描述符,保留父文件描述符,并将其用作pipe

的末端

  1. 您现在有两个进程,每个进程都有一个文件描述符,表示同一管道的不同端。请注意,这两个进程都在运行相同的程序,但是它们在调用fork之后进入了不同的分支。如果父进程在其套接字上调用write,则子进程将能够从其套接字读取数据,反之亦然

下面是代码的直接转换:

代码语言:javascript
复制
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 */
}

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

如果您想要两个独立的程序进行通信(例如,您有一个名为client的可执行文件和一个名为server的可执行文件),您不能使用此机制。相反,您可能会:

  • 使用UNIX套接字(其中一台主机上的IPC管道由文件名标识-只有当客户端和服务器在同一台计算机上运行时才有效)
  • 或使用TCP/IP套接字(其中IP地址和端口标识管道,并且客户端和服务器可以位于不同的计算机上)

如果您并不特别需要套接字,并且愿意要求客户机和服务器在同一台机器上运行,那么您也可以使用共享内存或消息队列。

票数 71
EN

Stack Overflow用户

发布于 2012-07-13 05:47:41

socketpair创建一对匿名的套接字,通常是unix/本地套接字,它们只在父进程和子进程之间的通信中有用,或者在需要使用它们的进程可以从公共祖先继承文件描述符的其他情况下才有用。

如果要在不相关(从父进程的意义上)的进程之间进行通信,则需要使用socketbindconnect在一个进程中创建一个侦听套接字,并在另一个进程中创建一个客户端套接字以连接到该套接字。

票数 8
EN

Stack Overflow用户

发布于 2012-07-15 03:25:45

对于两个进程之间的通信,是的,进程间通信或IPC是您应该寻找的。套接字只是一种通信方法,如果您必须实现一对多连接,则套接字非常有用。意味着一个服务器进程以请求-响应方式与多个客户端进程通信。由于您是IPC的新手,因此套接字地址和涉及的细节看起来很难掌握,这是可以理解的。(尽管在适当的时候你会发现它们很容易:-)

对于您的问题,我建议您使用更简单的IPC机制,如管道、FIFO、消息队列。我不确定您是如何得出使用socketpair的结论的。由于你没有提到任何关于你所需要的IPC的设计或种类,并且基于使用级别,我强烈建议你在一些书或互联网上查看管道或FIFO示例代码。它们看起来应该比套接字更容易实现,工作速度也更快。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11461106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档