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

时间:2011-02-09 22:17:34

标签: c# sockets tcp

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

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

有一些像BeginSendFixed,EndSendFixed,BeginReceiveFixed和EndReceiveFixed这样的东西会很不错。这些行为与BeginSend,EndSend,BeginReceive,EndReceive完全相同,但在传输请求的字节数之前不会调用回调。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

请注意,在.NET 4中添加了TaskCompletionSource。如果您尚未使用该平台,那么我建议将完成例程封送到UI线程(可以使用基于事件的异步轻松完成) Nito.Async.Sockets)中的模式套接字包装器,然后将它们放在特定于您的协议的解析器中(其示例为on my blog)。