我想开发一个客户端服务器应用程序,我想让它尽可能健壮。我有很多问题,我在互联网上找不到明确的答案。 假设服务器在一个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>
答案 0 :(得分:1)
套接字值发生了什么
无。该套接字上的send()
最终会失败,其上的recv()
将传递零或-1,但套接字本身保持打开状态,并且变量值不受影响。没有魔力。
它会变成INVALID_SOCKET吗?
没有
答案 1 :(得分:0)
对我来说,更好的想法是当您从任何客户端收到对服务器的请求时,只需创建一个新线程并将任务分配给该线程。通过这样做,您可以使服务器并行处理客户端请求,并处理来自多个客户端的多个请求。因此,没有客户端需要等待服务器完成已经提交请求的客户端的请求。如果你这样实现,你不需要打扰如果连接断开会发生什么。在正常情况下,如果更正了更正,您将在将回复发送到客户端时在服务器中获取此信息,并且您可以将该过程标记为失败并将其记录到服务器日志中。