|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
03.03.2012, 14:41 | #1 |
Пользователь
Регистрация: 19.06.2008
Сообщений: 32
|
Опять про сокеты
Уважаемая общественность. Опять про сокеты. Теперь в C#.
Прошу помощи. Делаю многопоточный сервер. Дабы не утомлять, вычистил код и оставил одного клиента, так как значения не имеет. Все отлично. Клиенты подключаются, работают и передают и принимают данные в разных потоках. Все прекрасно, пока клиент не отключится и не будет подключаться снова. При отключении срабатывает исключение в методе MessageReceiver_Sender. Я пытаюсь отключиться и освободить все ресурсы, стартовать заново, чтобы снова ждать клиента. Все клиенты коннектятся по заранее известному порту, поэтому я пытаюсь его закрыть и открыть снова, но сокет вне зависимости от моих действий после отключения клиента (закрыть, или только отключить для повторного использования) входит в какое-то состояние, при котором он принимает подключение клиента, но обмен не идет. Как корректно убить сокет или заставить его использоваться повторно? Заранее спасибо за помощь. namespace arm { class SocketServerClass { // Включен ли сервер public bool isServerRunning; // Это сокет нашего сервера Socket listener; // Точки для прослушки IPEndPoint PointK //переменные для работы сервера byte[] BytesFromARMK = new byte[6];//все данные с клиента передаются в этот массив public void ServerStart(int num) { try { isServerRunning = true; listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Определяем конечную точку PointK = new IPEndPoint(IPAddress.Any, 1900); } catch (Exception ex) { ClassFileDir.WriteToLogFile("Server Start: " + ex.Message); } SocketAccepter(num); } // Этот метод будет обрабатывать входящие соединения. private void SocketAccepter(int NumOfClient) { Thread MainListeningThread = new Thread(delegate() { Run(NumOfClient); }); MainListeningThread.IsBackground = true; // задаем фоновый режЫм MainListeningThread.Priority = ThreadPriority.Normal; // указываем приоритет MainListeningThread.Start(); } private void Run(int num) { try { string name = ""; // Связываем сокет с конечной точкой listener.Bind(PointK); name = "ARMK"; // Начинаем слушать входящие соединения listener.Listen(10); // Создаем новый сокет, по которому мы сможем обращаться к клиенту Socket client = listener.Accept(); // Начинаем принимать входящие пакеты и отправлять свои MessageReceiver_Sender(client, name, num); } catch (Exception ex) { ClassFileDir.WriteToLogFile("Socket Accepter: " + ex.Message); } } // Этот метод принимает пакеты от всех подключенных клиентов private void MessageReceiver_Sender(Socket r_client, string name, int NumOfClient) { while (true) { try { // Сюда будем записывать принятые байты // Принимаем case "ARMK": r_client.Receive(BytesFromARMK); FormMain.pFormMain.StrFromARMK = Encoding.ASCII.GetString(BytesFromA RMK); // Отсылаем клиентам byte[] byteArray; byteArray = Encoding.ASCII.GetBytes(FormMain.pF ormMain.StrToARMK); r_client.Send(byteArray); } catch (Exception ex) { ClassFileDir.WriteToLogFile("Messag eReceiver_Sender in Server: " + ex.Message); //Здесь смотрю у кого возникло исключение, чтобы, убив его, перезапустить потом FormMain.pFormMain.ReadyToDie = true; FormMain.pFormMain.WhoReadyToDie = NumOfClient; //Вот здесь я пытаюсь как-то избавиться от залипшего сокета!!!! r_client.Shutdown(SocketShutdown.Bo th); r_client.Disconnect(true); r_client.Close(10); r_client.Dispose(); } } } } ------------------------------------- ///вот так выглядит старт сервера //Экземпляр сервера SocketServerClass ArmServerK = new SocketServerClass(); ArmServerK.ServerStart(1); |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Опять про печать. | СтаниславАВ | Microsoft Office Excel | 3 | 07.04.2011 07:41 |
Опять про каптчу | kardinal94 | Работа с сетью в Delphi | 11 | 20.09.2010 20:20 |
Вопрос про сокеты | Unconnected | Работа с сетью в Delphi | 0 | 28.07.2009 00:30 |
Опять про гистограммму | artemavd | Общие вопросы Delphi | 10 | 15.07.2008 11:44 |
Опять клиент-сервер. Сокеты. | Atom63 | Работа с сетью в Delphi | 4 | 04.02.2007 21:27 |