我在同一系统上有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)。
如果您希望两个单独的程序进行通信(例如,您有一个称为客户端的可执行文件,而一个名为服务器的可执行文件),则不能使用此机制。相反,您可以:
如果您不需要插槽,并且很高兴要求客户端和服务器在同一台计算机上运行,则还可以使用共享内存或消息队列。