Socket服务器,SocketAsyncEventArgs和.Net中的并发连接

时间:2011-02-23 15:25:49

标签: .net sockets tcp

我一直在编写基于CodeProject上的套接字服务器,它本身来自原始的Microsoft example

在这两种情况下,使用相同的 SocketAsyncEventArgs 立即将入站邮件返回给发件人。 就我而言,我需要关闭入站消息,以便在回复客户端之前进行进一步的异步处理。

问题是返回的响应可能会尝试同时使用相同的 SocketAsyncEventArgs 作为来自客户端的进一步消息。 当发生这种情况时,我得到了这个例外:

"An asynchronous socket operation is already in progress using this SocketAsyncEventArgs instance"

所以,(我相信)我需要一个单独的 SocketAsyncEventArgs 池来传回消息。到目前为止一切都可以理解。

我的问题是我不确定如何创建出站 SocketAsyncEventArgs ,因为它与入站密切相关。

我可以重复使用多少入站数据?例如如果我只是指向同一个AcceptSocket,那么当消息同时向两个方向传播时会有麻烦吗?

有没有人有一些示例代码,说明如何从入站版本派生出站 SocketAsyncEventArgs ? 或者我错过了这一点?

1 个答案:

答案 0 :(得分:3)

这些SocketAsyncEventArgs对象,您可以随意使用它们。他们为你服务。它几乎只涉及他们使用的 Socket 缓冲区

因此,以CodeProject文章为例,在整个接收之后立即为 SendAsync()重用相同的SAEA实例是有意义的(可能由几个 ReceiveAsync()组成电话)已经完成。作者声明该协议是:所涉及的各方轮流发送和接收。

在您的情况下,最简单的方法是在整个接收完成后将SAEA实例释放回池中。然后,稍后,在完成额外的消息处理之后,您可以使用池SocketAsyncEventArgs对象中刚刚弹出的新发送操作发出。

另一种选择是在异步处理过程中继续将接收操作使用的SAEA从回调传递回调,然后最后用它来发回已处理的消息。

相关问题