使用null缓冲区调用recv()时会发生什么

时间:2013-05-08 05:30:41

标签: sockets

我很想知道在拨打电话时会发生什么。

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

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

此致 基兰

3 个答案:

答案 0 :(得分:0)

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

如果指定的长度为零,则应该得到零返回值,而没有数据写入缓冲区。

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

答案 1 :(得分:0)

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

使用带有posix套接字的cygwin和gcc。

如果您收到数据并且请求的大小较小,则可以重复调用recv以获取其余数据。取决于您的套接字是非阻塞还是当套接字没有更多数据时,recv返回-1,而errno是EAGAIN或EWOULDBLOCK。如果它是阻塞的,它将阻塞,直到填充缓冲区或函数被中断。

答案 2 :(得分:0)

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

  

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

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