2015-03-08 2 views
0

Я учусь работать с сокетами в c. Вот мой код:Recv call get empty data

void work_with_client(int client_sock){ 
    char buff[10] = {0}; 

    while(1){ 
      kv_log_message("\tWork with client\n"); 
      int is_received = recv(client_sock, buff, 10, 0); 
      if(is_received < 0){ 
        perror("Received failed"); 
      } else { 
        printf("RESPONSE: %s\n", buff); 
      } 
      printf("RESPONSE %d\n", is_received); 

      sleep(1); 
    } 
} 

При подключении через Telnet к этому серверу и немедленно отключить сервер печати этой строки:

Work with client 
RESPONSE: 
RESPONSE 10 
    Work with client 
RESPONSE: 
RESPONSE 10 
    Work with client 
RESPONSE: 
RESPONSE 10 
    Work with client 
RESPONSE: 
RESPONSE 10 
    Work with client 
RESPONSE: 
RESPONSE 1 
    Work with client 
RESPONSE: 
RESPONSE 0 
    Work with client 

И я не понимаю, почему первые 4 recv звонки получить полный размер данных буфера (я ничего не пишу в сокет с точки зрения клиента). Любые предложения? P.S. Запуск на Mac OS X Yosemite

UPDATE: я проверить свою программу на Linux, и RECV вызов всегда возвращает 0, в моем случае, так вероятно, проблема в телнет на Mac OS X

ответ

0

Хорошо я получить его, telnet на Mac OS X (Yosemite) отправить некоторые данные, если вы просто закрыть терминал без надлежащего соединения закрытия через сам телнет (т.е. поместить побег характер и quit команду).

Честно говоря, я не знаю, это ошибка или какое-то поведение отладки.

1

Когда recv() вернулся 0 этот указывает, что другая сторона отключила соединение.

От man recv:

ВОЗВРАТ СТОИМОСТИ

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

Возможно, вам захочется выйти из петли while().


Update:

Также код может вызвать неопределенное поведение, передав не 0 -завершённый "строка" в printf().

Чтобы исправить это, прочитайте один char минус buff, затем размер и добавьте 0 -терминатор.

while (1) 
    { 
     ssize_t is_received = recv(client_sock, buff, sizeof buff - 1, 0); 
     if (is_received < 0){ 
       perror("Received failed"); 
       break; 
     } else if (is_received == 0) { 
       printf("%s\n", "peer shutdown"); 
       break; 
     } 

     buff[is_received] = '\0'; 
     printf("RESPONSE: %s\n", buff); 
    } 
+0

Yeap, но как насчет первых 4 вызовов recv, которые возвращают значение '10', хотя клиент уже закрывает соединение – kirugan

+0

Может быть, Telnet отправил некоторые вещи для переговоров. –

+0

Ваше обновление не разрешает проблему, теперь оно показывает мне значение '9' вместо' 10' =) – kirugan

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

  • Нет связанных вопросов^_^