我很想知道进行以下调用时会发生什么。
recv(<socket no>, NULL , <lenght> , 0) ;
还有一个问题是,在调用套接字上的 recv 函数后,数据会被刷新,还是真的发生了什么?
问候, 基兰
我很想知道进行以下调用时会发生什么。
recv(<socket no>, NULL , <lenght> , 0) ;
还有一个问题是,在调用套接字上的 recv 函数后,数据会被刷新,还是真的发生了什么?
问候, 基兰
如果您提供非零长度,则最好有一个非 NULL 指针来放入数据,否则您将遇到各种麻烦。
如果指定的长度为零,您应该得到一个零返回值,并且没有数据写入缓冲区。
如果提供的缓冲区太小,是否丢弃数据取决于连接类型。
如果缓冲区为 NULL 且大小为非零,则 recv 的返回值为 -1。我对其进行了测试,errno 设置为 ECONNABORTED,但这对我来说听起来像是一个奇怪的错误。
将 cygwin 和 gcc 与 posix 套接字一起使用。
如果你收到数据并且请求的大小更小,你可以反复调用recv来获取剩下的数据。当套接字没有更多数据并且 errno 是 EAGAIN 或 EWOULDBLOCK 时,取决于您的套接字是否是非阻塞的,recv 返回 -1。如果它是阻塞的,它将阻塞直到缓冲区被填满或函数被中断。
我不知道你为什么会问这个问题。不要用空缓冲区调用 recv(),这是我的建议。结果充其量是未定义的,最坏的情况至少是 SIGSEGV。
还有一个问题是,在调用套接字上的 recv 函数后,数据会被刷新,还是真的发生了什么?
这取决于。在 TCP 中,未读数据仍有待下次读取。在 UDP 中,数据报的未读部分被丢弃。