2016-05-02 3 views
0

У меня есть скрученный сервер, который что-то делает, а затем закрывает соединение. Клиенты python понимают сКлиент C++ должен выяснить, что сокет был закрыт витым сервером

clientConnectionLost(self, connector, reason) 

что соединение было закрыто и работает нормально. Однако у меня также есть клиент C++, взаимодействующий с тем же витым сервером. В настоящее время он, похоже, не понимает, что соединение/сокет было закрыто. Как я могу проверить это?

string tcp_client::receive(int size=1024) 
{ 
    char buffer[size]; 
    string reply; 

    int msg = recv(sock , buffer , sizeof(buffer) , 0); 

    // Receive a reply from the server 
    if(msg < 0) 
    { 
     puts("recv failed"); 
     // Exit the programm 
     exit(0); 
    } 
    reply = buffer; 
    return reply; 
} 

является кодом приема клиента C++. Как достичь той же/подобной функции clientConnectionLost с клиентом C++?

+0

Пробовали ли вы улавливать 'SIGPIPE'? –

+0

Извините, но это не значит для меня много ... Не могли бы вы немного разобраться? –

ответ

0

От man recv:

Возвращаемое значение будет 0, когда одноранговый выполнил порядок выключения.

Таким образом, после recv вызова, вы можете написать:

string tcp_client::receive(int size=1024) 
{ 
    char buffer[size]; 
    string reply; 

    // Receive a reply from the server 
    int msg = recv(sock , buffer , sizeof(buffer) , 0); 

    if(msg < 0) 
    { 
     puts("recv failed"); 

     // Exit the programm 
     exit(0); 
    } 
    else if (0 == msg) 
    { 
     // the connexion has been closed by server 
     puts("Connexion lost!"); 

     // close the socket 
     close(sock); 

     // return something 
     return string(""); 
    } 
    reply = buffer; 
    return reply; 
} 
+0

Спасибо, это было потрясающе !!! : D –