You need to enable JavaScript to run this app. C语言不同文件创建的socket如何通信?client端write调用应传入哪个文件描述符
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 06:15:11