Как обеспечить синхронизацию между клиентом и сервером - PullRequest
0 голосов
/ 02 февраля 2012

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

     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 Ответ

1 голос
/ 25 мая 2015

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...