Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.21.97.61] |
|
Сообщ.
#1
,
|
|
|
Написал небольшой ТСР сервер .. вроде бы все ок... но корректно работает через раз
каждый второй клиент зависает в cListener.AcceptTcpClient() ... при дебаге на строчке тайм-аут ексепшн скорее всего что-то где-то упустил.. было бы неплохо если бы хто-то подсказал что именно... код ниже.. class Server { private TcpListener listener; private bool working = false; private const int port = 54321; public static ManualResetEvent tcpClientConnected = new ManualResetEvent(true); public Server() { string hostname = Dns.GetHostName(); IPAddress localIP = Dns.GetHostAddresses(hostname)[0]; listener = new TcpListener(localIP, port); } public bool StartServer() { Console.WriteLine("start server "+working); listener.Start(); working = true; while (working) { try { tcpClientConnected.Reset(); IAsyncResult asyncResult = listener.BeginAcceptTcpClient(new AsyncCallback(DoAcceptSocketCallback), listener); tcpClientConnected.WaitOne(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } return true; } public static void DoAcceptSocketCallback(IAsyncResult ar) { Console.WriteLine("accept incomming connection"); TcpListener cListener = (TcpListener)ar.AsyncState; TcpClient client = cListener.AcceptTcpClient();//timeout exception Console.WriteLine("crete tcp client"); Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientConnection)); clientThread.Start(client); tcpClientConnected.Set(); } private static void HandleClientConnection(Object client) { Console.WriteLine("Client handle"); } } |
Сообщ.
#2
,
|
|
|
а зачем тебе DoAcceptSocketCallback статик?
у тебя в единицу времени обрабатывается один запрос пулом потоков. потому и простои. сделай его методом класса. з.ы. используй пулл потоков вместо трида. это и эффективнее и быстрее: /// <summary> /// CONSTRUCTOR /// </summary> public TCPWorker() { //Увеличиваю пулл потоков int iThreadCount; int iPortsCount; ThreadPool.GetMinThreads(out iThreadCount, out iPortsCount); ThreadPool.SetMinThreads(iThreadCount + 10, iPortsCount + 20); ..... } /// <summary> /// Прослушивание сокета /// </summary> public void Listening() { if (Listener != null) { Listener.Start(); while (!StopThread) { while (!Listener.Pending()) Thread.Sleep(Delay); ThreadPool.QueueUserWorkItem(new WaitCallback(WorkWithClient), Listener.AcceptTcpClient()); } Listener.Stop(); } else RaiseEvent("Объект Listener не создан в потоке прослушивания"); } /// <summary> /// Работа с клиентом /// </summary> /// <param name="o">TcpClient</param> private void WorkWithClient(Object o) { TcpClient client = o as TcpClient; if (client == null) return; .... } |
Сообщ.
#3
,
|
|
|
Спасибо за консультацию...
на самом деле ошибка была еще глупее Почему-то вставил TcpClient client = cListener.AcceptTcpClient(); вместо EndReceive такие глупые ошибки найти труднее всего.. а относительно Пула потоков.. наверное так и сделаю |