我正在制作一个小程序,它有一台服务器和客户端在同一台机器上进行通信,就是这样。但我不能让服务器等待从客户端收到消息。为什么循环不会像第一次那样在int iRecvA = recv(acceptSocket, machId, STRLEN, 0);
行等待?我进入最后else
。
while (!done)
{
int iRecvA = recv(acceptSocket, machId, STRLEN, 0);
int iRecvB = recv(acceptSocket, serialNum, STRLEN, 0);
if (iRecvA && iRecvB > 0)
{
//stuff
}
else if (iRecvA && iRecvB == 0)
{
cout << "Connection closed\n";
cleanup(acceptSocket);
return 0;
}
else
{
cerr << "ERROR: Failed to receive message\n";
cleanup(acceptSocket);
return 1;
}
strcpy_s(sendMessage, "Activation was successful!\n\n\n");
int iSend = send(acceptSocket, sendMessage, strlen(sendMessage), 0);
if (iSend == SOCKET_ERROR)
{
cerr << "ERROR: Failed to send message\n";
cleanup(acceptSocket);
return 1;
}
}
答案 0 :(得分:-1)
您在其中一个套接字上遇到了流末尾,但您的代码没有正确检查它。您的代码不会正确检查任何返回值。你似乎认为
iRecvA && iRecvB > 0
如果它们都是正面的那么就是真的,
iRecvA && iRecvB == 0
如果它们都为零,则为真。他们不是。您需要单独检查它们,并打印实际错误。您应该在尝试第二个recv()
之前检查第一个recv(),
的结果,但是要使用现有的代码结构:
if (iRecvA < 0 || iRecvB < 0)
{
cerr << "ERROR: " << strerr[errno] << "Failed to receive message\n";
close(iRecvA);
close(iRecvB);
cleanup(acceptSocket);
return 1;
}
// else
if (iRecvA == 0 || iRecvB == 0)
{
cout << "Connection closed\n";
close(iRecvA);
close(iRecvB);
cleanup(acceptSocket);
return 0;
}
// else
{
// stuff
}
另请注意else
之后的return
是多余的。