C Winsock программирование: ввод мусора - PullRequest
1 голос
/ 08 января 2010

Я программирую очень простой сокет-сервер, следуя этому примеру кода . Сервер запущен и работает, и я могу подключиться к нему через telnet (на самом деле, используя Putty). Всякий раз, когда получено новое соединение, я порождаю новый поток, который имеет следующий код:

DWORD WINAPI receive_cmds(LPVOID lpParam) 
{
      char outbuffer[100];
      outbuffer[0] = '\0';
      char inbuffer[100];
      inbuffer[0] = '\0';
      int res;
      SOCKET current_client = (SOCKET)lpParam;

      while (1) {           
          res = recv(current_client, inbuffer, sizeof inbuffer - 1, 0);
          if (res > 0) {
              inbuffer[res] = '\0';
              printf("Got '%s'\n", inbuffer);
          }              
          Sleep(10);

          if (res == 0) {
             closesocket(current_client);
             ExitThread(0);             
          }                          

          //printf("%s\n", inbuffer); 
          strcpy(inbuffer, "");
      }
}

Как только я подключаюсь, он печатает этот бред:

alt text

Если я введу «hello», а затем «stackoverflow» в клиенте, это то, что я получаю:

alt text

Даже если я явно объявил конец строки '\ 0', кажется, что она занимает гораздо больше строки, плюс я не знаю, почему она печатает ввод два раза, второй - первый минус первый один или два символа.

Любая помощь в понимании того, что происходит? Заранее спасибо.

РЕДАКТИРОВАТЬ: отредактировано в соответствии с предложением unwind

Ответы [ 2 ]

3 голосов
/ 08 января 2010

Вы должны сделать лучшую проверку ошибок и более разумную обработку буфера:

res = recv(current_client, inbuffer, sizeof(inbuffer), 0);

должно быть

res = recv(current_client, inbuffer, sizeof inbuffer - 1, 0);
if (res > 0)
{
  inbuffer[res] = '\0';
  printf("Got '%s'\n", inbuffer);
}

Вам нужно оставить место в буфере для терминатора, чтобы вы не могли использовать весь буфер для получения данных. И вы должны проверить -1 и завершить буфер, чтобы превратить его в строку, прежде чем печатать его как таковой.

0 голосов
/ 08 января 2010

Я полагаю, что recv () возвращает "-1" (что означает ошибку).

Мне нужно увидеть остальную часть вашего кода, чтобы догадаться, почему. Попробуйте проверить наличие возврата -1 и затем вызвать WSAGetLastError (), чтобы выяснить причину ошибки.

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