2012-02-02 2 views
0

Мой сервер отправляет пакеты клиенту, но второй пакет не отображается. Я не знаю, почему это происходит, если мой сокет имеет блокирующий тип.Как выполнить синхронизацию между клиентом и сервером

 while(1){ 
      memset(buf,0,1024); 
      numbytes=0; 

      if ((numbytes = recv(sockfd, buf, 1024, 0)) == -1) { 
        perror("recv"); 
        exit(1); 
       } 
      buf[numbytes] = '\0'; 
      printf("%s\n",buf); 
      fflush(stdout); 
      } 
    fclose(fp); 
    close(sockfd); 
+1

Что вы имеете в виду * пытаетесь получить дважды *? Не могли бы вы прояснить свой вопрос? – cnicutar

+0

Wireshark - удобный инструмент, который может помочь вам в этих ситуациях – stdcall

+0

это означает, что цикл повторяется дважды, первый раз я получил данные, которые я отправляю с сервера во второй раз, только один, но, по мне, он должен блокировать и ждать данных поступать со стороны сервера. – tod

ответ

1

Это может произойти из-за того, что ваш сервер отправляет пустую строку. Таким образом, ваш клиент не блокируется, потому что он получил символ '\0', и он ничего не печатает, потому что это пустая строка.

Вторая причина может заключаться в том, что ваш сервер закрыл соединение. В этом случае значение numbytes равно нулю, и ваш клиент ничего не печатает, потому что вы также получаете пустую строку в своем буфере.

Одна из проблем с кодом заключается в том, что если сервер отправляет 1024 байта или более, numbytes будет равен 1024, а выражение buf[numbytes] вызовет ошибку сегментации, если размер вашего буфера также равен 1024. Вы можете предотвратить эта проблема, получив 1023 вместо 1024.

+0

Или он мог обрабатывать данные как байты, а это не строка. Он мог бы попробовать 'printf («%. * S », numbytes, buf)' или 'fwrite (buf, 1, numbytes, stdout)' –

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