【发布时间】:2019-11-21 01:13:41
【问题描述】:
我的服务器有时不接受新连接。当我打开多个 TCP 连接时会出现此问题,但并非总是如此。
服务器部署在多个远程位置(云端),在不同的RTT下进行测试。当我打开单个 TCP 连接时,一切都按预期工作,但是当我尝试从同一客户端到服务器(在不同端口上)的 2 个或多个 TCP 连接时,连接失败。
特别是,我已经测试了多达 5 个 TCP 连接,本地和通过在云上部署服务器(RTT 75ms 的服务器上时,连接大部分时间 (~90%) 在第二个端口上不被接受。
我认为这与高 RTT 有关,因为这是两个位置之间的唯一区别。一旦我将阻塞模式设置为 true,它就会起作用,但我可以看到这会显着降低应用程序的性能(由于阻塞)。
这是代码:
List<Socket> _socket = new List<Socket>();
List<int> _Ports = new List<int> (3) { 48005, 48006, 48007 };
void FunServer ()
{
for (int ii = 0; ii < _Ports.Count; ii++)
{
_socket .Add(new Socket(SocketType.Stream, ProtocolType.Tcp));
_socket [ii].Blocking = false;
IPEndPoint _endPoint = new IPEndPoint(IPAddress.Any, _Ports [ii]);
_socket[ii].Listen(10);
_socket [ii].Bind(_endPoint);
}
Thread _listeningThread = new Thread(this.ListeningFun);
_listeningThread.IsBackground = true;
_listeningThread.Start();
}
void ListeningFun()
{
while (true)
{
for (int ii = 0; ii < _Ports.Count; ii++)
{
Socket _newClient = null;
try
{
_newClient = oServerSocket[ii].Accept();
}
catch (SocketException e)
{
if (e.SocketErrorCode != SocketError.WouldBlock)
{
\\it never enters here
}
else
{
break; // when fails this the error received is: A non-blocking socket operation could not be completed immediately
}
}
// some other code here ...
}
Thread.Sleep(10);
}
}
如果我将阻塞模式设置为 true,它会起作用,但应用程序的性能会降低。
我的问题是,既然我每 10 毫秒检查一次,为什么不能读取第二次(或第三次等)?
我在两台机器上都运行了 Wireshark,我可以看到数据包都完好无损地到达了两个端口。
我应该如何处理这个问题?我应该使用异步操作吗?
【问题讨论】:
-
异步可能会让事情变得更容易。您可以设置为等待连接并在事件发生时获取。
-
@SamiKuhmonen 谢谢,我会用异步试试看
标签: c# sockets networking