Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 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);
_Инженер_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Опять про печать. СтаниславАВ 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