C++ C/C+中的TCP服务器+;:发送超时消息

C++ C/C+中的TCP服务器+;:发送超时消息,c++,c,sockets,tcp,server,C++,C,Sockets,Tcp,Server,我正在寻找一种为一个连接设置超时的方法,我已经找到了一些非常好的答案,但仅超时对我来说是不够的 我希望最后一条服务器->客户端消息是关于超时的通知。我不想突然中断和客户的联系,让他们不知所措 我要找的是: if ( /* should timeout now */ ) { char timeout_msg [] = "Connection timed out"; if (send(sock_fd, timeout_msg, sizeof(timeout_msg), 0) <

我正在寻找一种为一个连接设置超时的方法,我已经找到了一些非常好的答案,但仅超时对我来说是不够的

我希望最后一条服务器->客户端消息是关于超时的通知。我不想突然中断和客户的联系,让他们不知所措

我要找的是:

if ( /* should timeout now */ )
{
   char timeout_msg [] = "Connection timed out";
   if (send(sock_fd,  timeout_msg, sizeof(timeout_msg), 0) < 0)
   {
      perror("Sending problem");
      return whatever;
   }

   //actually time out now
}
if(/*现在应该超时*/)
{
char timeout_msg[]=“连接超时”;
if(发送(sock\u fd,timeout\u msg,sizeof(timeout\u msg),0)<0)
{
perror(“发送问题”);
回报一切;
}
//现在真的超时了
}

那么问题是什么呢?像这样的事情应该没问题。当您关闭TCP套接字时,操作系统将对其进行一段时间的维护,以确保最后一位数据都能传输到另一端。这种情况的问题是,您可能会在读取超时后发送它,这已经意味着对等方或网络出现故障。因此,无法保证您甚至能够发送消息,也无法保证对等方能够正确响应。如果它能够做到这一点,那么超时就根本不应该发生。这对我来说似乎毫无意义。只需关闭连接,让对等方自行处理即可。EJP还指出,如果您的发送缓冲区恰好已满(鉴于之前的超时,这比通常情况更可能),甚至几乎已满,则发送超时消息的尝试可能没有空间[完全]排队,这就破坏了jschutlz410提到的尽力而为逻辑。进一步说我自己的观点,如果超时消息超时,会发生什么?您不能向行为不端的对等方发送错误消息。