c# - 使用 tcp 套接字异步发送/接收固定数量的数据

标签 c# sockets tcp

在我的应用程序中,我通过 TCP 套接字进行一些异步通信。

我不喜欢允许 Socket 类的发送和接收操作(同步或异步)在请求的字节数被传输之前完成这一事实。例如:当我想从套接字读取 X 字节时,我不想关心实现此目的(在我的应用程序逻辑中)需要多少读取操作。我只想在完成时(或发生错误时)收到通知。

如果有像 BeginSendFixed、EndSendFixed、BeginReceiveFixed 和 EndReceiveFixed 这样的东西就好了。它们的行为与 BeginSend、EndSend、BeginReceive、EndReceive 完全相同,但在传输请求的字节数之前不会调用回调。

我正在考虑自己实现这个,基于:

http://msdn.microsoft.com/en-us/magazine/cc163467.aspx

在 DoTaskHelper 函数中,我会调用尽可能多的(同步)发送或接收,直到所有数据都传输完毕。

这是要走的路还是有不同的(更好的)方法来隐藏我的应用程序逻辑对多次发送/接收的需求?

最佳答案

我建议为此使用 TaskCompletionSource 类。这样做的好处是不会仅仅等待 I/O 就烧毁线程。首先将现有(异步)API 包装为 Task,然后使用 TaskCompletionSource 创建您的 API 可能会更容易。

请注意,TaskCompletionSource 是在 .NET 4 中添加的。如果您还没有使用该平台,那么我建议将完成例程编码到 UI 线程(这可以使用 Event 轻松完成-based Asynchronous Pattern socket wrappers in Nito.Async.Sockets ),然后将它们放入特定于您的协议(protocol)的解析器(例如 on my blog )。

关于c# - 使用 tcp 套接字异步发送/接收固定数量的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4951190/

相关文章:

c# - 在不引用 Windows Workflow Foundation 中的设计 DLL 的情况下创建自定义事件设计

c# - TcpClient.GetStream().Read() 与 TcpClient.Client.Receive()

Postgresql服务器远程连接

c - TCP 服务器在 ubuntu 14.04 上使用错误的端口号

sockets - 如何检查 TCP 发送缓冲区的容量以确保数据传递

c# - 分配 null 是否会从对象中删除所有事件处理程序?

c# - 每个数据库提供程序具有一组 TableAdapter 的强类型数据集?

c# - Observable<string> 更新事件?

java - 读取和处理流

c# - 我可以为使用套接字而不是 “Windows store app library”的Windows应用商店编写一个库吗?