C语言不同文件创建的socket如何通信?client端write调用应传入哪个文件描述符
问题修复方案
你的代码存在两处核心错误,修复后即可正常通信:
1. 服务端参数传递错误(导致read读无效文件描述符)
你当前定义的my_pipe函数使用值传递传入fd参数,函数内部对fd = s2的赋值仅会修改临时形参,无法把有效连接套接字s2的值回传给main函数的pipe_fds变量。最终main函数调用read时用的是未初始化的随机值,自然读不到任何数据。
修复方式:
修改my_pipe函数定义为传指针,让函数可以修改外部变量的值:
// 将原函数定义 int my_pipe(int fd) 改为如下形式 int my_pipe(int *fd) { // 原有创建套接字、监听、accept逻辑全部保持不变 // 仅修改最后给fd赋值的行: *fd = s2; close(s1); return 0; }
同时修改server中main函数调用my_pipe的代码,传入pipe_fds的地址:
// 将原调用 psts = my_pipe(pipe_fds); 改为 psts = my_pipe(&pipe_fds);
2. 客户端write文件描述符错误
进程的文件描述符表是互相独立的,你不需要获取服务端的套接字fd,客户端connect调用成功后,返回的本地套接字s0已经和服务端的s2建立了双向通信链路,直接往s0写数据即可。
修复方式:
将client中write行的占位符替换为s0:
write(s0, buffer, strlen(buffer) + 1);
额外补充
你代码中的my_pipe命名容易产生误解,这个函数实际是Unix域套接字的服务端初始化逻辑,和系统调用pipe没有关系,后续可以考虑改名避免混淆。
内容的提问来源于stack exchange,提问作者Brandon O
相关产品推荐
相关产品推荐

