0

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

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

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

当在单元测试中使用模拟对象(无延迟)来模拟正常的套接字操作时,一切正常。

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

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

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

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

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

当然,还有 tls 启动、握手和身份验证,这些都运行良好,但是当连接开始运行,并且通道开始自己的通信时,唯一确定的是接收到的数据具有大小和通道号作为标头。

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

这与测量自上次发送操作以来接收到的数据量以及传输缓冲区的满载情况相结合,我决定接收更多或开始发送,或者什么都不做,并在 xx 毫秒内再次轮询。

我现在意识到这是错误的。

我是否试图完成仅使用一个套接字连接根本不可能完成的事情?

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

谢谢,西奥。

4

0 回答 0