【问题标题】:C file transfer questionC文件传输问题
【发布时间】:2009-11-05 03:09:46
【问题描述】:

我实现了一个客户端-服务器程序,允许以黑白方式传输文件。服务器正在使用 select() 检查套接字的变化。 每个测试都很好,除了这个: - 当服务器向客户端发送一个大文件时(尚未完成),客户端按“Ctrl-C”杀死客户端程序,然后服务器也被杀死:(

sn-p:

fprintf(stderr,"Reading done, sending ...\n");
if(send(sockClient, sendBuf, chunk_length, 0) < 0)
{
    printf("Failed to send through socket %d \n", sockClient);
    return -1;
}
fprintf(stderr,"Sending done\n");

当客户端被杀死时,服务端显示:

user$./server
Reading done, sending ...
Sending done
Reading done, sending ...
Sending done
Reading done, sending ...
Sending done
Reading done, sending ...
user$

它有什么问题? 感谢您的回答!

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    您可能想忽略 SIGPIPE。尝试在您的服务器启动中添加类似的内容:

    #include <signal.h>
    signal(SIGPIPE, SIG_IGN);
    

    【讨论】:

      【解决方案2】:

      send() 调用只能在套接字处于connected 状态时使用(以便知道预期的接收者)。返回是发送的字节数... if(send(sockClient, sendBuf, chunk_length, 0) &lt; 0) 所以断开连接时,它会跳出...

      【讨论】:

      • 对,您所说的“跳过”是您的进程从系统接收 SIGPIPE 的地方。
      • 您可以控制是否使用 MSG_NOSIGNAL 代替 send() 中的 0 获得信号。您仍然会收到错误 EPIPE(尽管如果您没有安装 SIGPIPE 处理程序,则 send() 不会返回)。
      【解决方案3】:

      MSG_NOSIGNAL 不可移植,在 Windows 上不可用。

      【讨论】: