【问题标题】:Socket servers, SocketAsyncEventArgs and concurrent connections in .Net.Net 中的套接字服务器、SocketAsyncEventArgs 和并发连接
【发布时间】:2011-02-23 15:25:48
【问题描述】:

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

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

问题在于,返回的响应可能会尝试同时使用相同的 SocketAsyncEventArgs 作为来自客户端的进一步消息。 发生这种情况时,我会收到此异常:

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

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

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

我可以重复使用多少入站数据?例如如果我只是指向同一个AcceptSocket,消息同时双向传输会不会有问题?

有没有人有一些如何从入站导出出站 SocketAsyncEventArgs 的示例代码? 还是我没抓住重点?

【问题讨论】:

    标签: .net sockets tcp


    【解决方案1】:

    这些 SocketAsyncEventArgs 对象,你可以随意使用。他们为你服务。而且它几乎只涉及他们使用的 Socketbuffer

    因此,以 CodeProject 文章为例,在整个接收(可能由几个 ReceiveAsync() 调用)已完成。作者指出协议是:参与的每一方轮流发送和接收。

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

    另一种选择是在异步处理期间将接收操作使用的 SAEA 从回调传递到回调,然后最终将其用于发回处理后的消息。

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 2019-12-10
      • 2011-03-21
      相关资源
      最近更新 更多