我在同一个系统上有两个应用程序需要来回通信。根据我的研究,我认为这被称为进程间通信,使用socketpair()是解决我的问题的最好方法。
我正绞尽脑汁(从字面上)开始尝试用C语言中的socketpair()来创建套接字。据我所知,套接字是一个非常复杂的话题,而我作为一个C程序员新手肯定对这种情况没有帮助。
我用谷歌搜索了过去的48小时,读了一些教程,等等,但我还是找不到。我理解这个概念,但是代码太混乱了。我已经读过这篇文章几次了:http://beej.us/guide/bgnet/html/single/bgnet.html,但它还不够简单。
有没有人能提供一些例子(简单到五年级学生都能理解),或者给我一个好的教程?
发布于 2012-07-13 05:54:56
您只能在创建这两个进程时使用socketpair,如下所示:
socketpair -现在您有了两个套接字文件描述符(单个管道的两端)
fork -现在你有两个进程fork返回0,你就是子进程。关闭父文件描述符,保留子描述符,并将其用作此进程的管道末端fork返回非零,则您就是父进程。关闭子文件描述符,保留父文件描述符,并将其用作pipe的末端
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 */
}请注意,这只是示例代码:我省略了所有的错误检查和合理的流协议。
如果您想要两个独立的程序进行通信(例如,您有一个名为client的可执行文件和一个名为server的可执行文件),您不能使用此机制。相反,您可能会:
如果您并不特别需要套接字,并且愿意要求客户机和服务器在同一台机器上运行,那么您也可以使用共享内存或消息队列。
发布于 2012-07-13 05:47:41
socketpair创建一对匿名的套接字,通常是unix/本地套接字,它们只在父进程和子进程之间的通信中有用,或者在需要使用它们的进程可以从公共祖先继承文件描述符的其他情况下才有用。
如果要在不相关(从父进程的意义上)的进程之间进行通信,则需要使用socket、bind和connect在一个进程中创建一个侦听套接字,并在另一个进程中创建一个客户端套接字以连接到该套接字。
发布于 2012-07-15 03:25:45
对于两个进程之间的通信,是的,进程间通信或IPC是您应该寻找的。套接字只是一种通信方法,如果您必须实现一对多连接,则套接字非常有用。意味着一个服务器进程以请求-响应方式与多个客户端进程通信。由于您是IPC的新手,因此套接字地址和涉及的细节看起来很难掌握,这是可以理解的。(尽管在适当的时候你会发现它们很容易:-)
对于您的问题,我建议您使用更简单的IPC机制,如管道、FIFO、消息队列。我不确定您是如何得出使用socketpair的结论的。由于你没有提到任何关于你所需要的IPC的设计或种类,并且基于使用级别,我强烈建议你在一些书或互联网上查看管道或FIFO示例代码。它们看起来应该比套接字更容易实现,工作速度也更快。
https://stackoverflow.com/questions/11461106
复制相似问题