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

11

我正在编写一个套接字服务器,基于 CodeProject 上的一个示例,该示例本身源自 Microsoft 的示例

在这两种情况下,入站消息会立即使用相同的 SocketAsyncEventArgs 返回给发送方。 而在我的情况下,在回复客户端之前,我需要将入站消息送到进一步的异步处理中。

问题在于,返回的响应可能会尝试同时使用与来自客户端的另一条消息相同的 SocketAsyncEventArgs 。 当出现这种情况时,我会收到以下异常:

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

所以,(我认为)我需要一个单独的 SocketAsyncEventArgs 池来处理发出的消息。 到目前为止都可以理解。

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

我能重复使用多少入站消息?例如,如果我只是指向同一个 AcceptSocket,当消息同时在两个方向传输时是否会出现问题?

有没有人有一些示例代码,可以从入站消息派生出站的 SocketAsyncEventArgs ? 还是我没有理解到关键点?

1个回答

3
这些SocketAsyncEventArgs对象可以根据您的需要使用。它们为您服务。几乎只涉及到它们使用的Socket和buffer。
因此,以CodeProject文章为例,重复使用相同的SAEA实例来执行SendAsync()操作是有意义的,紧接着整个接收过程完成(可能由多个ReceiveAsync()调用组成)。作者指出协议是:每个参与方轮流发送和接收。
在您的情况下,最简单的方法是在整个接收完成后将SAEA实例释放回池中。然后,在您完成额外的消息处理后,可以使用从池中新弹出的SocketAsyncEventArgs对象发出全新的发送操作。
另一种选择是在异步处理期间从回调传递用于接收操作的SAEA,最后将其用于发送已处理的消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接