什么是幸福和套接字,当另一端关闭它?

时间:2018-02-21 09:28:03

标签: c++ sockets winapi winsock2

我想开发一个客户端服务器应用程序,我想让它尽可能健壮。我有很多问题,我在互联网上找不到明确的答案。 假设服务器在一个while(TRUE)循环上运行并且检查命令是否存在它是命令队列,如果有,它发送它,如果没有,它只是继续到循环的头部。 但是,如果另一端发生故障,或者两者之间存在连接错误,套接字值发生了什么,它会变成INVALID_SOCKET怎么办?

while (TRUE) {
       if (ReqQueue->size() != 0 && ReqQueue->front() != string("STOP")) { // there is some command in the ReqQueue which is NOT STOP.
           int sent = send(ClientSocket, ReqQueue->front().c_str(), (int)strlen(ReqQueue->front().c_str()), 0);
           if (sent == (int)strlen(ReqQueue->front().c_str()))
               ReqQueue->pop(); // Next Command.
           else if (int err = WSAGetLastError() == WSAETIMEDOUT){
                   shutdown(ClientSocket, SD_BOTH);
                   closesocket(ClientSocket);
                   return;
            }
        else 
            continue;
    }
    else if (ReqQueue->size() == 0) {
        continue;
    }
    else if(ReqQueue->front() == string("STOP"))
    {
        if (send(ClientSocket, "STOP", strlen("STOP"), 0) == strlen("STOP")) {
            /*Message received indication from target*/
            shutdown(ClientSocket, SD_BOTH);
            closesocket(ClientSocket);
            return;
        }
    }
}
shutdown(ClientSocket, SD_BOTH);
closesocket(ClientSocket);
return 0;

这是来源:)

我想问的是,有一种更好的方法可以实现上述目标,也许我可以将while循环条件更改为while(套接字正常)或while(仍然存在连接)。< / p>

2 个答案:

答案 0 :(得分:1)

  

套接字值发生了什么

无。该套接字上的send()最终会失败,其上的recv()将传递零或-1,但套接字本身保持打开状态,并且变量值不受影响。没有魔力。

  

它会变成INVALID_SOCKET吗?

没有

答案 1 :(得分:0)

对我来说,更好的想法是当您从任何客户端收到对服务器的请求时,只需创建一个新线程并将任务分配给该线程。通过这样做,您可以使服务器并行处理客户端请求,并处理来自多个客户端的多个请求。因此,没有客户端需要等待服务器完成已经提交请求的客户端的请求。如果你这样实现,你不需要打扰如果连接断开会发生什么。在正常情况下,如果更正了更正,您将在将回复发送到客户端时在服务器中获取此信息,并且您可以将该过程标记为失败并将其记录到服务器日志中。