套接字编程问题

时间:2010-05-03 03:59:40

标签: c sockets variable-assignment

我收到以下声明:

char inbuff[500], *ptr;

int n, bufferlen;

编写程序段以从TCP套接字sock接收具有500位的消息,并将此消息存储在inbuff中。

我的回答是:

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

但是,我不确定为什么* ptr在声明中给出。

所以,我想问一下,这个问题中指针的目的是什么?

或者我的节目分段错了?

首先感谢你们所有人的帮助!

3 个答案:

答案 0 :(得分:1)

如果请求的数据量尚未到达(返回值是收到的确切数量),

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.

答案 1 :(得分:0)

您的代码片段有一些错误。正如James所说,你需要sizeof而不是strlen才能获得缓冲区的大小。但更重要的是,recv并不像你想象的那样工作。确保你完全明白它的保证。

答案 2 :(得分:0)

ptr可能没有用,但我会使用n = recv(sock, inbuff, 500, 0);,因为strlen(inbuff);不一定是500;