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
相关产品推荐
相关产品推荐

