如果服务器断开连接,c中的套接字编程不会引发任何错误



我编写了一个套接字服务器程序,该程序在一个线程(fork子进程(中每200ms向客户端发送一条消息,并在另一个线程中等待从客户端获取数据。问题是,如果服务器连接断开,就不会出现任何错误。我尝试过使用信号(SIGPIPE(并检查errrno变量。

当我断开服务器热点时,数据会发送到套接字,并且不会显示错误。

这是代码:

int ListeningForConnection(int Sockfd) {
int clilen = sizeof(Cli_addr);           
int SocketId; 

while(1) {  
printf("waiting for new client...n");
if ((SocketId = accept(Sockfd, (struct sockaddr *)&Cli_addr, (socklen_t *)&clilen)) < 0) {
printf("%s", "ERROR on accept. errno:%d : %sn", errno, strerror(errno)); 
close(Sockfd); 
return
}

printf("opened new communication with clientn");       
if (fork() == 0)
SendDataToClient(SocketId);                 
else 
GetDataFromClient(SocketId); 
// if any error happen, should waiting for new client to connect. 
}
return 0; 

发送数据到客户端:

while(1) {  
int n;
if ((n = send(socket, SendData ,strlen(SendData), MSG_CONFIRM)) < 0) {
printf("%sn", "ERROR writing to socket"); 
return; 
}

printf ("%s   No:%d  %s n ",SendData,n,strerror(errno));
delay(200);
}

当我断开服务器热点时,数据会发送到套接字,并且不会显示错误。

问题不在于您的程序,而在于您的期望。

TCP在临时中断客户端和服务器应用程序之间的连接时是稳健的,这就是断开热点时的实际操作。一旦再次建立连接,TCP将从中恢复,即它将在本地缓冲未确认的数据,并在一段时间内重试发送这些数据。

我尝试过使用信号(SIGPIPE(并检查errrno变量。

如果TCP连接实际上已关闭,但不是在临时中断时,则会发生错误和/或SIGPIPE。关闭可以由客户端或服务器显式完成,也可以在检测到不可恢复的传递问题时隐式完成,例如由于超时或TCP保持活动。如果情况并非如此,则对套接字的写入将直接成功,或者如果套接字缓冲区内没有更多空间,则写入将阻塞(如果套接字正在阻塞(。

对于空闲连接上中断连接的早期检测,请使用TCP保持活动。为了检测传递数据的问题,请对未确认的数据使用超时。

相关内容

最新更新