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

Sockets 使用null缓冲区调用recv()时会发生什么,sockets,Sockets,我很想知道打了下面的电话后会发生什么 recv(<socket no>, NULL , <lenght> , 0) ; recv(,NULL,0); 还有一个问题是,在调用recv函数之后,套接字上的数据被刷新了,或者到底发生了什么 问候,, Kiran如果提供非零长度,最好使用非空指针将数据放入,否则会遇到各种麻烦 如果指定的长度为零,则返回值应为零,且没有数据写入缓冲区 如果提供的缓冲区太小,是否丢弃数据取决于连接类型。如果缓冲区为空且大小为非零,则recv的返回

我很想知道打了下面的电话后会发生什么

recv(<socket no>, NULL , <lenght> , 0) ;
recv(,NULL,0);
还有一个问题是,在调用recv函数之后,套接字上的数据被刷新了,或者到底发生了什么

问候,,
Kiran

如果提供非零长度,最好使用非空指针将数据放入,否则会遇到各种麻烦

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


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

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

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


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

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

还有一个问题是,在调用recv函数之后,套接字上的数据被刷新了,或者到底发生了什么


视情况而定。在TCP中,未读数据仍需下次读取。在UDP中,数据报的未读部分将被丢弃。

感谢您的响应。还有一个问题是,在调用recv函数之后,套接字上的数据会被刷新,或者实际发生了什么?您可以测试发生了什么。“脸红”是什么意思?解释一下你在做什么,也许可以给出更有用的答案。除非有文件证明它接受缓冲区的空指针,否则答案是“这是未定义的行为,任何事情都可能发生”。没有提到NULL,因此它是未定义的行为。这里提到了当需要读取的数据超过适合的数据量时会发生什么情况-根据套接字类型,多余的数据可能会被丢弃。@CodeCaster-我刚刚浏览了我们项目中的现有代码,我是我们项目的新手,也是套接字编程的新手。所以我只想知道,一旦用有效缓冲区数据调用recv(),就会从套接字中读取数据,然后套接字上的数据就会被删除,或者是如何删除的?这就是我的问题。“在那之后,套接字上的数据将被删除,或者是如何删除的?”-你害怕什么,套接字API返回相同的数据两次?谁在乎成功的
recv()
调用后操作系统缓冲的数据保留在哪里?作为socket API用户,您并不关心这一点。如果socket API决定将数据从缓冲区中取出,用于跳舞和喝酒,您不必在意,因为您的缓冲区中充满了您请求的数据。那么你真正的问题是什么?你预计会发生什么?如果你得到那个问题的答案,你会怎么做?你会改变操作系统缓冲区吗?我怀疑。你很可能会得到一个SIGSEGV。recv()不会“阻塞直到缓冲区被填满”,它会阻塞直到至少接收到一个字节-1实际上这是我所期望的:),但当我运行代码时,它会在cygwin上返回此错误。不过,关于1字节,您是对的。我认为Cygwin一定是在让您免受实际影响。另一方面,“未定义的行为”也可以包含带有错误代码的优雅返回。:)“结果充其量是未定义的,充其量是一个SIGSEGV,至少是一个。”我认为SIGSEGV比未定义的行为好,因为你无法真正知道何时存在未定义的行为。