You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言Socket编程客户端执行send操作出现段错误问题求助

问题定位与修复方案

客户端段错误核心诱因

  • 野指针访问:fopen("new.txt", "rb")的返回值没有赋值给声明的fp变量,fp是未初始化的野指针,后续fread、fclose操作直接访问非法内存触发段错误。
  • 无效文件描述符调用:send操作使用了初始化值为0的sfd,而非已经建立连接的有效套接字socket_desc;create分支调用write_file时传入的new_sock是未初始化的野值,也会触发非法内存访问。
  • 逻辑错误:send分支的循环内直接写了return 2,读取一次文件就直接终止程序,根本不会执行发送逻辑。
  • 无效数据发送:发送指令时用sizeof(command)作为发送长度,会把整个50字节数组的内存垃圾值一起发送给服务端,正确应该用strlen(command)+1发送实际字符串长度。

服务端隐藏问题

  • 逻辑无效:new_socket未初始化就判断if (new_socket<0),无任何实际作用;写了死循环接收连接,循环后的write_file、receive_file代码永远不会执行。
  • 无效文件描述符:循环中accept传入的第一个参数是初始化值为0的fd,而非监听套接字socket_desc,服务端根本无法正常接收客户端连接。
  • 野指针访问:receive_file函数中filename未初始化就传入fopen,调用该函数会直接触发段错误。

关键修复示例

客户端send分支修复

if(strcmp(command, "send") == 0) {
    fp = fopen("new.txt", "rb"); // 把fopen返回值赋值给fp
    if(fp != NULL) {
        while( (b = fread(sendbuffer, 1, sizeof(sendbuffer), fp))>0 ) {
            // 用有效连接套接字发送数据,移除循环内的return
            if(send(socket_desc, sendbuffer, b, 0) < 0) {
                perror("send failed");
                break;
            }
        }
        if(b < 0) perror("file read failed");
        fclose(fp);
        printf("[+]File data sent successfully.\n");
    } else {
        perror("fopen failed");
    }
}

服务端accept逻辑修复

// 移除无效的new_socket判断
addr_size = sizeof(new_addr);
while(1){
    // 用监听套接字socket_desc作为accept第一个参数
    confd = accept(socket_desc, (struct sockaddr*)&new_addr, &addr_size);
    if (confd==-1) {
        perror("Accept");
        continue;
    }
    // 后续文件接收逻辑保持即可
}

内容的提问来源于stack exchange,提问作者Ilyas Nawawie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:54:01