2014-02-09 29 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

相關問題