gpt4 book ai didi

c# - TCP Socket SendAsync 操作是否可以在不传输 BufferList 中的所有字节的情况下完成?

转载 作者:IT王子 更新时间:2023-10-29 04:45:13 26 4
gpt4 key购买 nike

在 Mono 3.12 上,我使用 Socket.SendAsync(SocketAsyncEventArgs)使用 TCP Stream Socket 来实现基于请求的流协议(protocol)。我正在使用 SocketAsyncEventArgs.BufferList设置多个数据缓冲区。

Socket 的文档中和 SocketAsyncEventArgs , 我找不到任何关于 SocketAsyncEventArgs.Completed 的提及当使用 BufferList 时,可以在不发送所有字节的情况下引发,留下我们必须根据 SocketAsyncEventArgs.BytesTransferred 进行验证的印象.

另一方面,Socket.BeginSend做出这样的保证

When your application calls BeginSend, the system will use a separate thread to execute the specified callback method, and will block on EndSend until the Socket sends the number of bytes requested or throws an exception.

当使用 SendAsyncSocketAsyncEventArgs.BufferList 时,规范对传输的字节数有何保证?

假设事件以 SocketError.Success 完成.

最佳答案

在将 SendAsync 与 SocketAsyncEventArgs.BufferList 一起使用时,规范对传输的字节数有何保证?

首先,可以在出现错误时引发事件,在这种情况下,您可以假设并非所有字节都已传输。为此,您需要测试 SocketAsyncEventArgs.SocketError 的 SocketError.Success。此外,如果您提到“规范”,我假设您指的是 (Microsoft) Windows Sockets 文档(因为您链接到此以获取 SendAsync 和其他描述)。

为了在成功调用 Completed 事件时也弄清楚文档对传输字节数的说明或暗示,我们必须执行几个步骤。第一步是查看 SendAsync 是否使用重叠 I/O。 Overlapped Input / Output 中回答了这个问题文档。此机制的实现对于底层传输提供程序是强制性的,因此它是唯一保证可用于 Windows 套接字的重叠 I/O 机制。因此,SendAsync 保证使用具有 WSA_FLAG_OVERLAPPED 属性的套接字。

请注意检查 SendAsync reference implementation显示 SendAsync 确实使用了具有重叠 I/O 的 WSASend,但这只是一个观察。

第二步是确定重叠的 I/O 告诉我们哪些有关已完成事件的信号与传输的字节数有关。这种情况在几个地方都有描述,例如在这个 Overlapped I/I and Event Objects页面:“当发送缓冲区已被消耗时将提供指示”。 [WSASend] 函数的备注部分给出了更多细节:“当缓冲区已被传输消耗时,将出现完成指示,调用例程的完成或事件对象的设置” .

这仍然为准确解释这句话留下了一些空间。基本上它表示数据已被套接字范围外的底层传输机制接受和确认。这并不一定意味着它已经到达远程端点协议(protocol)层,这取决于通信协议(protocol)。对于 TCP 流套接字,我会推断它表明数据已到达远程端点。

这里的结论是文档保证(对于非错误情况)仅在所有字节都已传输时引发 SendAsync 完成事件。

关于c# - TCP Socket SendAsync 操作是否可以在不传输 BufferList 中的所有字节的情况下完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41470548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com