C# TCP服务器一次只接受来自一个iOS设备的消息

C# TCP服务器一次只接受来自一个iOS设备的消息,c#,tcp,C#,Tcp,我使用c#创建一个TCP服务器以连接到iOS设备。但是,我发现它一次只能接受一台iOS设备。我想不出是什么问题。谁能看一看问题出在哪里 IPAddress ipadr = IPAddress.Parse(localIP); System.Net.IPEndPoint EndPoint = new System.Net.IPEndPoint(ipadr, 8060); newsock.Bind(EndPoint);

我使用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();

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

一般模式为:

接受操作完成 将AcceptSocket切换到将从该套接字异步接收数据的代码。 再次呼叫Accept以侦听更多客户端

如果要进行同步接收,同样的原理也适用


检查此问题:

有两种套接字:用于侦听的套接字(从未连接)和对应于连接的套接字(每个套接字代表一个连接)

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

如果您希望一次处理多个客户机(这几乎总是必需的),则必须确保始终挂起对Accept的调用,以便可以接受新客户机

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

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

client=newsock.Accept()之后创建一个线程,将剩余的工作委托给它,然后再次调用Accept。使用异步方法
newsock.beginacept
可以是另一种选择。将Accept设为异步是错误的想法,我甚至不知道这将如何解决问题。他需要在Accept之后使所有内容都异步,而不是阻止下一个Accept。我非常清楚地说过,他应该将数据交给异步接收。至于第一部分,他不需要异步,但使用它也没有坏处。如果他说,“我一小时只有一个用户”,那么是的,使用AcceptSync将是错误的方法,因为不需要快速连续地处理accept操作。您在这里给出了正确的观点。基本上,只有当一个线程无法跟上所有新的传入客户机(比如每秒100k左右)时,您才需要有多个未完成的accept调用。在这一点之后,还不清楚网络堆栈是否能够利用多个线程来处理同一套接字上的accept调用。