Вопрос программирования сокетов - PullRequest
0 голосов
/ 03 мая 2010

Мне дано следующее объявление:

char inbuff[500], *ptr;

int n, bufferlen;

Написать программный сегмент для получения сообщения, содержащего 500 бит, от сокета TCP-сокета и сохранить это сообщение в буфере.

Мой ответ:

n = recv( sock, inbuff, strlen( inbuff ), 0 );

Однако я не уверен, почему * ptr указан в объявлении.

Итак, я хотел бы спросить, какова цель указателя в этом вопросе ??

Или мой программный сегмент неверен?

Спасибо за вашу первую помощь!

Ответы [ 3 ]

1 голос
/ 03 мая 2010

recv может вернуть меньше данных, чем вы запрашивали, если запрошенный объем данных еще не поступил (возвращаемое значение - это точная полученная сумма) - так что вам нужно поместить программу в цикл, и используйте p, чтобы указать следующее местоположение для получения дополнительных данных, пока вы не заполните буфер.

В Linux есть флаг MSG_WAITALL, который пытается ограничить это поведение, но он не идеален:

   MSG_WAITALL (since Linux 2.2)
          This flag requests that  the  operation  block  until  the  full
          request  is  satisfied.  However, the call may still return less
          data than requested if a signal is caught, an error  or  discon‐
          nect  occurs,  or the next data to be received is of a different
          type than that returned.
0 голосов
/ 03 мая 2010

Ptr, вероятно, не является полезным, однако я бы использовал n = recv(sock, inbuff, 500, 0);, потому что strlen(inbuff); не обязательно будет 500;

0 голосов
/ 03 мая 2010

Ваш фрагмент кода содержит некоторые ошибки. Как упоминал Джеймс, вам нужен sizeof, а не strlen, чтобы получить размер вашего буфера. Но что более важно, recv работает не совсем так, как вы думаете. Убедитесь, что вы точно понимаете, что это дает.

...