Tag: tcplistener

接受多个tcp客户端的最佳方式?

我有一个客户端/服务器基础设施。 目前,他们使用TcpClient和TcpListener在所有客户端和服务器之间发送接收数据。 我目前所做的是当收到数据时(在它自己的线程上),它被放入一个队列中供另一个线程处理,以释放套接字,使其准备好并打开以接收新数据。 // Enter the listening loop. while (true) { Debug.WriteLine(“Waiting for a connection… “); // Perform a blocking call to accept requests. using (client = server.AcceptTcpClient()) { data = new List(); // Get a stream object for reading and writing using (NetworkStream stream = client.GetStream()) { // Loop to receive all the data […]

如何设置TcpListener始终侦听和接受多个连接?

这是我的服务器应用程序: public static void Main() { try { IPAddress ipAddress = IPAddress.Parse(“127.0.0.1”); Console.WriteLine(“Starting TCP listener…”); TcpListener listener = new TcpListener(ipAddress, 500); listener.Start(); while (true) { Console.WriteLine(“Server is listening on ” + listener.LocalEndpoint); Console.WriteLine(“Waiting for a connection…”); Socket client = listener.AcceptSocket(); Console.WriteLine(“Connection accepted.”); Console.WriteLine(“Reading data…”); byte[] data = new byte[100]; int size = client.Receive(data); Console.WriteLine(“Recieved data: […]

C#监听器线程的CPU使用率很高,睡眠未命中断开

我的连接处理程序如下(这比个人实验更多,而不是生产代码) 如果我没有在while循环中的任何地方添加一个Thread.Sleep,它会开始吸收CPU。相反,如果我做睡眠以缓解无休止的垃圾邮件,我会错过断开连接.. CPU的比例正常上升对于运行的客户端/线程的数量,所以不是监听器本身导致高使用率,它是下面发布的实际客户端线程..任何人对如何解决这个问题都有任何想法? (我正在避免基于等待的解决方案,因为我对async / await不够熟悉,并且线程方法对于这个相当小的项目工作正常) 我只是在SO周围寻找解决方案,并没有注意到任何这个特定的问题,或者提供了除了指导人们异步/等待文章之外的解决方案,所以很抱歉,如果我错过了适用的答案。 private void HandleConnection(CancellationToken ct) { int recv = 0; byte[] buf = new byte[4096]; Trace.WriteLine($”{_name} Connected”); if (_ns.CanWrite && _client.Connected) { _ns.Write(Encoding.BigEndianUnicode.GetBytes(“■WEL”), 0, Encoding.BigEndianUnicode.GetBytes(“■WEL”).Length); try { while (_client.Connected && !ct.IsCancellationRequested) { while (!_ns.DataAvailable) { //first attempted solution Thread.Sleep(100); // miss discon if i sleep here } if (ct.IsCancellationRequested) […]

我如何让TcpListener接受多个连接并单独使用每个连接?

我有一个运行良好的SMTP侦听器,但只能接收一个连接。 我的C#代码如下,我将其作为服务运行。 我的目标是让它在服务器上运行并解析发送给它的多个smtp消息。 目前它解析第一条消息并停止工作。 我怎样才能让它接受第2,第3,第4 …… SMTP消息并像第一个那样处理它? 这是我的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; using System.IO; namespace SMTP_Listener { class Program { static void Main(string[] args) { TcpListener listener = new TcpListener(IPAddress.Any , 8000); TcpClient client; NetworkStream ns; listener.Start(); Console.WriteLine(“Awaiting connection…”); client = listener.AcceptTcpClient(); Console.WriteLine(“Connection accepted!”); ns = client.GetStream(); […]

什么是ThreadPool服务器的async / await等价物?

我正在使用同步apis和线程池的tcp服务器看起来像这样: TcpListener listener; void Serve(){ while(true){ var client = listener.AcceptTcpClient(); ThreadPool.QueueUserWorkItem(this.HandleConnection, client); //Or alternatively new Thread(HandleConnection).Start(client) } } 假设我的目标是在资源使用率最低的情况下处理尽可能多的并发连接,这似乎很快就会受到可用线程数量的限制。 我怀疑通过使用非阻塞任务apis,我将能够用更少的资源处理更多。 我最初的印象是这样的: async Task Serve(){ while(true){ var client = await listener.AcceptTcpClientAsync(); HandleConnectionAsync(client); //fire and forget? } } 但令我印象深刻的是,这可能会导致瓶颈。 也许HandleConnectionAsync需要花费非常长的时间才能达到第一个await,并且会阻止主接受循环继续进行。 这只会使用一个线程,还是运行时会在多个线程上神奇地运行它看起来合适的东西? 有没有办法将这两种方法结合起来,这样我的服务器就可以使用它所需的线程数来满足正在运行的任务的数量,但是它不会在IO操作上不必要地阻塞线程? 在这种情况下,是否存在最大化吞吐量的惯用方法?