Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 异步接收是否可以在不读取我请求的所有字节的情况下返回?_Sockets_Asynchronous - Fatal编程技术网

Sockets 异步接收是否可以在不读取我请求的所有字节的情况下返回?

Sockets 异步接收是否可以在不读取我请求的所有字节的情况下返回?,sockets,asynchronous,Sockets,Asynchronous,我正在阅读关于如何使用异步套接字传输可变长度消息的文章 他说: 当多条消息到达服务器时会发生什么? 在处理多条消息时,必须记住接收操作可以返回从网络读取的任意字节数。通常,该大小是从0到Receive或BeginReceive方法中指定的缓冲区长度 所以,即使我告诉BeginReceive读取100字节,它也可能读取的字节数少于100字节,然后返回??? 我正在开发一个支持网络的软件(TCP/IP),我总是收到与我要求的字节数完全相同的数据 我甚至不理解逻辑:如果接收没有得到我要求的每个字节,为

我正在阅读关于如何使用异步套接字传输可变长度消息的文章

他说:

当多条消息到达服务器时会发生什么? 在处理多条消息时,必须记住接收操作可以返回从网络读取的任意字节数。通常,该大小是从0到Receive或BeginReceive方法中指定的缓冲区长度

所以,即使我告诉BeginReceive读取100字节,它也可能读取的字节数少于100字节,然后返回??? 我正在开发一个支持网络的软件(TCP/IP),我总是收到与我要求的字节数完全相同的数据

我甚至不理解逻辑:如果接收没有得到我要求的每个字节,为什么它会异步完成。。。就等着吧


也许它与IP与TCP有关?

如果套接字以异步模式运行,那么它将返回它当时实际拥有的任何字节,最多返回请求的字节数,但可以(通常)小于任何给定读取的请求字节数。不能保证每次获得的字节数与请求的字节数相同。您必须反复阅读,直到最终获得所需的所有字节,然后缓存剩余的所有字节,以便在以后有更多字节可用时进行处理。这正是Vadym的示例代码所做的。这种类型的读取是异步的,它让套接字在后台接收字节,而您继续执行其他操作,然后在有更多字节可用时通知您


您所考虑的是套接字在同步模式下的功能。它等待所有请求的字节到达,然后允许您的代码继续工作。

当以太网帧到达时,以太网设备驱动程序将整个帧复制到其内存中,只有在复制整个帧后,它才会通知上层(TCP)。然后,TCP层将数据复制到其缓冲区并调用套接字层。然后,套接字层将可用数据复制到称为套接字缓冲区的缓冲区空间。最后,将数据复制到用户缓冲区,并向进程发送信号

receive()返回的数据大小可能小于请求的数据的情况有哪些- 1) 如果以太网帧小于请求的大小 2) 如果TCP缓冲区大小(系统范围大小,可以在linux中检查sysctl参数-net.ipv4.TCP_rmem)小于请求的大小。 3) 如果套接字缓冲区大小(特定于应用程序的大小,可通过setsockopt()使用SO_RCVBUF设置)小于请求的大小

除上述情况外,如果指定的用户缓冲区大小足够容纳整个帧,则整个帧将始终复制到用户缓冲区


IP层在这里没有任何作用。

是的,这确实是一种奇怪的行为。然而,我是这样看的。。这可能是错误的,但经过长时间的调试后,我就是这样向自己解释的:-/

当您使用Receive Normal(synchronized)时,它读取的字节数比返回的字节数多。。好的 当您使用BeginReceive(异步)时,它会在开始读取n个字节时调用您

所以,换句话说,它确实尝试读取n个字节。。它只是告诉你它什么时候开始接收它们,而不是什么时候结束。然后,有时,读取n字节是不可能的,但不幸的是,您的开始信号已经被调用了

我同意你的说法,这个名字令人困惑

祝你好运