【问题标题】:asynchronously sending message to many tcp clients向多个 tcp 客户端异步发送消息
【发布时间】:2015-11-05 01:24:23
【问题描述】:

我有一个服务器程序,它接受大约 100000 个 tcp 客户端并使用异步套接字编程向它们发送数据。要向客户端发送数据,我使用一个为每个客户端调用 BeginSend 的 for 循环。 问题是当我开始向客户端发送数据时,新客户端在发送完成之前无法连接到服务器。 任何机构都可以帮我解决这个问题吗?

//This is the Loop that calls Send Method
foreach (ClientInfo item in followers)
{
    Socketing.Send(item.state, JSONData);
}

public static void Send(StateObject state, String data)
{
    byte[] byteData = Encoding.UTF8.GetBytes(data);
    state.workSocket.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), state);
}
private static void SendCallback(IAsyncResult ar)
{
    StateObject state = (StateObject)ar.AsyncState;
    Socket socket = state.workSocket;
    int bytesSent = socket.EndSend(ar);
}

【问题讨论】:

  • 首先显示一些代码,以便我们找出可能出现的问题。
  • 您需要在另一个线程上对这些回复进行排队。并且还限制/限制您一次使用的端口数量。

标签: c# sockets asynchronous tcp


【解决方案1】:

如果您使用单台计算机作为所有 100_000 个客户端的主机,那么它们使用的端口数量超过了您系统上可用的 65_535 个(实际上更少)端口。您用完了系统资源。

连接由 4 个变量标识:src ip、src port、dst ip、dst ports。在我描述的情况下,您的 src 端口用完了。

【讨论】:

  • 65535 是端口的限制。但是端口上的连接没有限制
  • 但是客户端使用不同的端口连接,并且客户端很可能都在一台机器上
  • 当我禁用代码的发送部分时,我最多可以接受 200000 个客户。但是当启用发送部分时,在发送数据时会停止接收新客户端
  • 这个答案似乎假设所有客户端都在同一台机器上;我在这个问题中看不到任何暗示。
  • 我猜测了一下,上面 Fariborz 的评论似乎证实了我的猜测。他正在使用自己的端口发送数据。
猜你喜欢
  • 2013-01-06
  • 2019-09-09
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 2018-05-16
  • 1970-01-01
相关资源
最近更新 更多