-->

Socketpair()在C / Unix的(Socketpair() in C/Unix)

2019-06-26 06:25发布

我有我需要来回通信在同一系统上2个应用程序。 从我的研究,我相信这就是所谓的进程间通信和使用socketpair的()是我的问题的最佳方法。

我撕我的头发(直译)试图开始建立与C. socketpair()插槽从我个人理解,插座是一个非常复杂的话题,我是一个新手C程序员肯定是没有帮助的情况。

我用Google搜索过去48小时,阅读教程等,但我仍然不能得到它。 我理解这个概念,但代码是太混乱。 我读过这篇文章了几声: http://beej.us/guide/bgnet/html/single/bgnet.html ,但它不是足够简单。

有人可以提供一些示例(如此简单第5年级的学生能理解),或指向我一个很好的教程?

Answer 1:

您可以使用socketpair只在您创建两个过程,就像这样:

  1. 调用socketpair -现在你有两个插座文件描述符(单管的两端)
    • 提名一端是父母和一个是孩子结束。 这并不重要,只是做出选择,坚持下去以后
  2. fork -现在你有两个进程
    1. 如果fork回到零,你是孩子。 关闭文件描述符,保住孩子的描述符,并把它作为管道的这个过程的结束
    2. 如果fork返回非零,你是家长。 关闭文件描述符,保持母体之一,并使用它作为您的末端治理
  3. 你现在有两个过程,每个人都有代表同一管道的不同端一个文件描述符。 请注意,这两个进程都运行相同的程序,但他们遵循不同的分支呼叫后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 */
}

请注意,这只是示例代码:我已经离开了所有的错误检查和明智的流协议。


如果你想两个独立的程序进行通信(例如,有一个名为客户端的可执行文件,一个叫服务器 ),则不能使用这种机制。 相反,你可以:

  • 使用Unix套接字(其中一台主机上的IPC管是由文件名标识-这仅适用于如果客户端服务器在同一台机器上运行)
  • 或使用TCP / IP套接字(其中一个IP地址和端口标识管,并在客户端服务器可以在不同的机器上)

如果没有特别需要插座,并且你很高兴,要求在同一台机器上的客户端服务器端运行,您还可以使用共享内存或消息队列。



Answer 2:

socketpair创建匿名对插座,通常是UNIX /本地插座,其是仅在父母和孩子之间的过程或在其他情况下的通信有用的,其中需要使用它们可以从一个共同的祖先继承文件描述符的过程。

如果你打算做无关之间的通信(在亲子的感觉)的过程,你需要使用socketbind ,并connect在一个过程中创建一个监听套接字,并创建一个客户端套接字连接到它的其它过程。



Answer 3:

对于两个进程之间的通信,是的,进程间通信或IPC是你应该寻找什么。 套接字只是对通信的方法之一,如果你要实现一个一对多的连接是非常有用的。 装置,一个服务器进程,其与在请求 - 响应的方式许多客户端进程进行通信。 当你是一个新手,以IPC,这是可以理解的套接字地址和所涉及的细节可能看起来难以把握。 (虽然你会发现他们很容易在适当的时间:-))

对于你的问题,我建议你使用像钢管,FIFO,消息队列简单的IPC机制。 我不知道你是如何得出的结论使用socketpair。 既然你没有提到IPC左右你所需要的设计或那种任何事情,bassed上使用级别我强烈建议寻找到一些书籍或网络管道或FIFO示例代码。 他们应该看的方式更容易实现,比插座工作得更快。



Answer 4:

使用TCP / IP。 虽然还有其他的IPC机制(如Unix域套接字和SYSV IPC)你与TCP / IP更好的原因有很多。 这里有一些:

  1. 有很多的教程和其他信息在网络上描述了怎么办TCP / IP
  2. 现代系统,尤其是Linux和* BSD,并处不显著处罚使用TCP / IP相比,比方说,Unix域套接字甚至SYSV IPC。
  3. 有许多库和框架,你可能能够利用通过TCP / IP通信应用。

在那里我不会使用TCP / IP,以两个“方案”之间沟通的唯一情况是,他们是真正的线程,而不是独立的程序的情况。



文章来源: Socketpair() in C/Unix
标签: c sockets unix ipc