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

Смежные вопросы