【问题标题】:Why is my server not waiting to receive reply from client?为什么我的服务器不等待接收来自客户端的回复?
【发布时间】:2014-02-09 03:29:51
【问题描述】:

我正在制作一个小程序,它具有在同一台机器上进行通信的服务器和客户端,确实如此。但我无法让服务器等待接收来自客户端的消息。为什么循环不像第一次那样在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;
    }
}

【问题讨论】:

  • 当您从诸如 recv() 之类的系统调用中收到错误时,您必须打印它,而不仅仅是您自己设计的一些消息。否则调试就变成了一场猜谜游戏。

标签: c++ visual-c++ networking


【解决方案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
}

还要注意elsereturn 之后是多余的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    相关资源
    最近更新 更多