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