【问题标题】:TCP server only accepts the message from one iOS device at a timeTCP 服务器一次只接受来自一台 iOS 设备的消息
【发布时间】:2014-06-30 15:45:59
【问题描述】:

我使用 c# 创建一个 TCP 服务器来连接到 iOS 设备。但是,我发现它一次只能接受一台 iOS 设备。我无法弄清楚是什么问题。谁能看看有什么问题?

            IPAddress ipadr = IPAddress.Parse(localIP);
            System.Net.IPEndPoint EndPoint = new System.Net.IPEndPoint(ipadr, 8060);
            newsock.Bind(EndPoint);
            newsock.Listen(10);
            client = newsock.Accept();
            IPEndPoint clientip = (IPEndPoint)client.RemoteEndPoint;
            while (true)
            {
                if (!isDisConnected)
                {
                data = new byte[1024];
                recv = client.Receive(data);
                if (recv == 0)
                    break;
                string receivedText = Encoding.ASCII.GetString(data, 0, recv);
            }
            client.Close();
            newsock.Close();

【问题讨论】:

  • client = newsock.Accept(); 创建线程后,将剩下的工作委托给它并再次调用 Accept。使用异步方法newsock.BeginAccept 可以是另一种选择。

标签: c# tcp


【解决方案1】:

socket有两种:你用来监听的socket(它从不连接)和对应连接的socket(每个socket代表一个连接)。

Accept 将一个已连接的套接字返回给刚刚被接受的客户端。每次对 Accept 的调用都会接受一个新的独立客户端。

如果您想一次处理多个客户(这几乎总是需要),您必须确保对 Accept 的调用始终处于挂起状态,以便可以接受新客户。

实现此目的的一个简单模型是永远接受循环,并为您接受的每个客户端启动一个线程:

while (true) {
 var clientSocket = listeningSocket.Accept();
 Task.Factory.StartNew(() => HandleClient(clientSocket));
}

【讨论】:

    【解决方案2】:

    看看 AcceptAsync。每个接受操作都允许一个连接,因此您必须再次调用 Accept。 AcceptAsync 异步工作,避免了必须创建委托或线程的困难。

    一般模型是:

    接受操作完成 将 AcceptSocket 移交给将从该套接字异步接收数据的代码。 再次调用 Accept 以监听更多客户。

    如果您想进行同步接收,同样的原则也适用。

    看看这个问题:Server design using SocketAsyncEventArgs

    【讨论】:

    • 使接受异步是错误的想法,我什至不知道这将如何解决问题。他需要让一切之后接受异步,而不是阻止下一个接受。
    • 我非常清楚地说他应该将数据交给异步接收。至于第一部分,他不需要异步,但使用它也没有坏处。如果他说“我一小时只有 1 个用户”,那么是的,使用 AcceptAsync 将是错误的方法,因为不需要快速连续处理接受操作。
    • 你在这里提出了有效的观点。基本上,只有当单个线程不能再跟上所有新传入的客户端(例如每秒 100k 左右)时,您才需要有多个未完成的接受调用。在那之后,还不清楚网络堆栈是否甚至能够利用多个线程来处理同一个套接字上的接受调用。
    猜你喜欢
    • 2021-08-06
    • 2010-10-15
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多