【发布时间】:2018-07-31 19:41:47
【问题描述】:
我想开发一个客户端服务器应用程序,我想让它尽可能健壮。有很多问题要问我,我只是在互联网上找不到明确的答案。 假设服务器在 while(TRUE) 循环上运行并检查命令是否存在是它的命令队列,如果有,它发送它,如果没有,它只是继续循环的头部. 但是如果另一端宕机了,或者两者之间出现连接错误,socket值会发生什么变化,会不会变成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(仍有连接)。
【问题讨论】:
-
如果 (TCP) 连接的另一端关闭其套接字,那么您的下一个
recv调用将返回0指示关闭。尝试继续使用套接字会导致错误。 -
刚刚由触发,我想让它尽可能健壮";您是否考虑过应用诸如 http 之类的高级协议?有大量(经过测试的)库实现了这种东西。
-
在一个不相关的注释中,
std::string有operator==overloads 接受指向常量字符串的指针(如字符串文字)。这意味着您不需要string("STOP")进行比较。做例如ReqQueue->front() == "STOP"应该也能正常工作。 -
“有没有更好的方法”,因为你在 Windows 上;查找
select(Linux 有一个更好的版本,称为poll;但它在 Windows 上非常有问题,不推荐使用;即使是微软) -
如您所见,上面的代码中没有recv调用,我想在没有recv时被注意到@Someprogrammerdude
标签: c++ sockets winapi winsock2