2009-11-05 78 views
1

我实现了一个客户端 - 服务器程序,允许它们传输文件。服务器正在使用select()来检查套接字的更改。 除了这一个,每个测试都很好: - 当服务器发送一个巨大的文件到客户端(尚未完成)时,客户端点击“Ctrl-C”杀死客户端程序,然后服务器也被杀死:(C文件传输问题

的片段:

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$ 

什么地方错了, 谢谢您的回答

回答

4

您可能想要忽略SIGPIPE。尝试在服务器启动时加入这样的事情:

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

send()调用可用于只有当插座处于connected状态(So预期的接收者是已知的)。回报是发送bytescount ... if(send(sockClient, sendBuf, chunk_length, 0) < 0) 所以在断开连接时,它跳过了......

+0

正确的,你所描述的“跳出”是你的进程从系统接收SIGPIPE的地方。 – 2009-11-05 03:35:48

+1

您可以控制是否使用MSG_NOSIGNAL代替send()中的0。您仍然收到错误EPIPE(尽管如果您没有安装SIGPIPE处理程序,则send()不会返回)。 – 2009-11-05 05:33:06

0

MSG_NOSIGNAL是不可移植的,并不会在Windows上使用。