2015-12-28 2 views
0

У меня есть простая программа, которая слушает сокет. Все идет хорошо, за исключением случаев, когда соединение теряется в цикле while(1). В этом случае программа попадает в считывание из сокета много раз без результата. Как я могу обнаружить отключенный клиент в цикле while(1)?Обнаружен клиент отключен

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <stdio.h> 
#include<string.h> 


void printHex(char * bts ) 
{ 
    char *s = bts; 
    int i=0; 
    do 
    { 
     printf("%02X ", (unsigned char ) *bts); 

    } while (* ++bts !=0); 
    printf("%s\n",s); 

} 


int main() 
{ 
    char str[100]; 
    int listen_fd, comm_fd; 

    struct sockaddr_in servaddr; 

    listen_fd = socket(AF_INET, SOCK_STREAM, 0); 

    bzero(&servaddr, sizeof(servaddr)); 

    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr = htons(INADDR_ANY); 
    servaddr.sin_port = htons(22000); 
    printf("binding\n"); 

    bind(listen_fd, (struct sockaddr *) &servaddr, sizeof(servaddr)); 

    printf("listening\n"); 

    listen(listen_fd, 10); 
    printf("accepting\n"); 

    comm_fd = accept(listen_fd, (struct sockaddr*) NULL, NULL); 
    printf("accep done\n"); 

    int cn =0; 

    while(1) 
    { 

     bzero(str, 100); 
     printf("will read\n"); 
     int br= read(comm_fd,str,100); 
     printf("read done\n"); 

     if (br>0) 
     { 
      printHex(str); 
     } 

    } 
} 

ответ

2

Изменение:

if (br>0) 
    { 
     printHex(str); 
    } 

To:

if (br<=0) break; 
    printHex(str); 

Кроме того, ваш код mishandles случай, когда первый байт равен нулю. И вы не можете избежать этого случая, потому что TCP не сохраняет границы сообщений приложения. Вы должны просто пройти br до printHex, чтобы он знал, сколько символов нужно печатать.

0

Необходимо проверить результат вашего read(). Если соединение закрыто, для него вы получите код возврата.

От manual page:

В случае ошибки возвращается -1, а ERRNO устанавливается соответствующим образом.