gpt4 book ai didi

c - C/Unix 中的 Socketpair()

转载 作者:太空狗 更新时间:2023-10-29 16:23:36 32 4
gpt4 key购买 nike

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

我正焦头烂额(字面意思)试图开始在 C 中使用 socketpair() 创建套接字。据我所知,套接字是一个非常复杂的主题,而我作为一个新手 C 程序员肯定无助于解决这个问题.

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

谁能提供一些示例(非常简单,五年级学生也能理解)或给我指点一个好的教程?

最佳答案

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

  1. 调用socketpair - 现在您有两个套接字文件描述符(单个管道的两端)
    • 指定一端作为,一端作为端。哪个都无所谓,先做出选择,以后再坚持吧
  2. 调用 fork - 现在你有两个进程
    1. 如果 fork 返回零,你就是 child 。关闭parent 文件描述符,保留child 描述符,并将其用作此进程的管道末端
    2. 如果 fork 返回非零值,则您是父项。关闭 child 文件描述符,保留 parent 并将其用作管道的末端
  3. 你现在有两个进程,每个进程都有一个文件描述符,代表同一管道的不同端点。请注意,这两个进程都在运行相同的程序,但它们在调用 fork 后遵循不同的分支。如果parent 在其套接字上调用writechild 将能够从 socket 读取该数据,反之亦然-反之亦然

这里直接翻译成代码:

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)。


如果您希望两个单独的程序进行通信(例如,您有一个名为client 的可执行文件和一个名为server 的可执行文件),您可以'使用这个机制。相反,您可以:

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

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

关于c - C/Unix 中的 Socketpair(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11461106/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com