当两个端点都执行Socket.SendAsync

时间:2017-01-18 15:40:50

标签: c# sockets socketasynceventargs

所以我编写了这个客户端/服务器套接字应用程序,它使用SocketAsyncEventArgs“方法”来执行异步套接字。

使用我用于许多其他应用程序的相同库,我现在第一次体验到我从未预料到的情况。

我们的新客户端/服务器应用程序启动后,开始向两个方向发送大量数据。

在使用模拟对象(没有延迟)的单元测试中完成模拟正常的套接字操作时,一切运行良好。

但是在使用真实套接字的实际情况中,我们会遇到一种死锁,其中两个端点都停留在Socket.SendAsync()操作中(是的,它返回true,未同步处理)

我的想法是双方的接收缓冲区已满,并且tcp堆栈不再响应任何帧。 (连接到127.0.0.1)

所以我把接收缓冲区设置为sendbuffer的两倍,但不幸的是,由于我们的“协议”的性质,以及我们如何确定发送或接收,它并不那么简单。

我现在必须重新考虑确定何时开始发送以及何时开始接收的方法。

一个复杂因素是,此连接的目的是通过此套接字连接多个双向通用通信通道。这意味着没有预先确定的通信序列,所有通道都可能有自己的协议。

当然,有一个启动,握手和身份验证,这些都运行良好,但是当连接变得可操作,并且通道开始自己的通信时,唯一可靠的是接收到的数据的大小和通道号是标题。

每次操作后,我都会检查接收缓冲区中是否有等待数据,或者检查Socket.Available。

这与测量自上次发送操作以来接收的数据量以及传输缓冲区的填充程度相结合,我决定接收更多数据或开始发送或不执行任何操作,并在xx ms中再次轮询。

我现在意识到这是冤屈。

我是否尝试完成仅使用一个套接字连接无法实现的功能?

任何人都试图完成类似的事情,或者知道一种很好的方法来完成一种不会引入这些奇怪锁定的安全方式。

谢谢, 西奥。

0 个答案:

没有答案