2014-02-09 28 views
-1

我正在制作一个小程序,它有一台服务器和客户端在同一台机器上进行通信,这是。但是我无法让服务器等待从客户端收到消息。为什么循环不会像第一次那样等待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

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

回答

-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是多余的。

+0

@downvoter请解释 – EJP

相关问题