我一直在编写一个基于CodeProject的套接字服务器,它本身来自原始的Microsoft示例.
在这两种情况下,使用相同的SocketAsyncEventArgs立即将入站消息返回给发件人.就我而言,我需要关闭入站消息,以便在回复客户端之前进行进一步的异步处理.
问题是返回的响应可能会尝试同时使用相同的SocketAsyncEventArgs作为来自客户端的进一步消息.发生这种情况时,我得到以下异常:
"An asynchronous socket operation is already in progress using this SocketAsyncEventArgs instance"
所以,(我相信)我需要一个单独的SocketAsyncEventArgs池来传回消息.到目前为止都可以理解.
我的问题是,我不确定如何创建出站SocketAsyncEventArgs,因为它与入站密切相关.
我可以重复使用多少入站数据?例如,如果我只指向同一个AcceptSocket,那么当消息同时向两个方向传播时会有麻烦吗?
有没有人有一些示例代码如何从入站的SocketAsyncEventArgs派生出来?或者我错过了这一点?
这些 SocketAsyncEventArgs 对象,您可以随意使用它们。他们为你服务。它几乎只涉及套接字和它们使用的缓冲区。
因此,以 CodeProject 文章为例,在整个接收(可能由多个ReceiveAsync()调用组成)完成后立即为SendAsync()重用相同的 SAEA 实例是有意义的。作者指出该协议是:参与各方轮流发送和接收。
在您的情况下,最简单的方法是在整个接收完成后将 SAEA 实例释放回池中。然后,稍后,在完成额外的消息处理后,您可以使用从池中新弹出的 SocketAsyncEventArgs 对象发出全新的发送操作。
另一种选择是在异步处理期间继续将接收操作使用的 SAEA 在回调之间传递,然后最终使用它来发送回处理后的消息。