0

我很想知道进行以下调用时会发生什么。

recv(<socket no>, NULL , <lenght> , 0) ;

还有一个问题是,在调用套接字上的 recv 函数后,数据会被刷新,还是真的发生了什么?

问候, 基兰

4

3 回答 3

0

如果您提供非零长度,则最好有一个非 NULL 指针来放入数据,否则您将遇到各种麻烦。

如果指定的长度为零,您应该得到一个零返回值,并且没有数据写入缓冲区。

如果提供的缓冲区太小,是否丢弃数据取决于连接类型。

于 2013-05-08T05:37:39.010 回答
0

如果缓冲区为 NULL 且大小为非零,则 recv 的返回值为 -1。我对其进行了测试,errno 设置为 ECONNABORTED,但这对我来说听起来像是一个奇怪的错误。

将 cygwin 和 gcc 与 posix 套接字一起使用。

如果你收到数据并且请求的大小更小,你可以反复调用recv来获取剩下的数据。当套接字没有更多数据并且 errno 是 EAGAIN 或 EWOULDBLOCK 时,取决于您的套接字是否是非阻塞的,recv 返回 -1。如果它是阻塞的,它将阻塞直到缓冲区被填满或函数被中断。

于 2013-05-08T05:51:41.630 回答
0

我不知道你为什么会问这个问题。不要用空缓冲区调用 recv(),这是我的建议。结果充其量是未定义的,最坏的情况至少是 SIGSEGV。

还有一个问题是,在调用套接字上的 recv 函数后,数据会被刷新,还是真的发生了什么?

这取决于。在 TCP 中,未读数据仍有待下次读取。在 UDP 中,数据报的未读部分被丢弃。

于 2013-05-08T08:39:50.833 回答