Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Асинхронный сервер на C# некорректно работает из-за одного if'a

67K
04 марта 2013 года
Chaz
12 / / 22.06.2011
Прив. ЕОС - есть один сервер, и он не хочет работать из-за одного if'a. Дело было так, на сервер приходит сообщение от клиента, и он отправляет это сообщение всем клиентам включая того, который это сообщение прислал. Я добавил некий идентификатор в класс ClientConnection и теперь, если приходит сообщение от клиента, то в метод, который отправляет сообщение всем клиентам, я передаю и идентификатор клиента, который прислал сообщение, а в методе проверяется, если идентификатор клиента не равен тому, который мы получили как параметр метода, то отправляем сообщение. Проблема в том, что после этой маленькой модификации сервер стал работать странно. Например, один клиент посылает сообщение, оно нормально приходит на сервер и к другим клиентам, но если уже другой клиент пошлет сообщение, то после второго раза, сообщения от него не доходят, но если первый клиент снова что-то отправит на сервер, то сначала придет его сообщение, а после - все сообщения от второго клиента склеенные в одно. В чем может быть проблема? Помогите плиз. Код сервера ">Видео, на котором показана проблема
1
05 марта 2013 года
kot_
7.3K / / 20.01.2000
во-первых, почему в одном случае используется паблик-поле, во втором вызов метода?
Во-вторых, какую роль играет список id?
В третьих - возможно причина в этих строчках:

 
Код:
bool willRaiseEvent = Sock.AcceptAsync(e);
            if (!willRaiseEvent)
                AcceptCompleted(Sock, e);
в асинхронном режиме метод будет возвращать true до тех пор пока ты не разорвешь соединение. ИМХО, проверяй, не тестировал.
67K
05 марта 2013 года
Chaz
12 / / 22.06.2011
Цитата: kot_
во-первых, почему в одном случае используется паблик-поле, во втором вызов метода?
Во-вторых, какую роль играет список id?
В третьих - возможно причина в этих строчках:

 
Код:
bool willRaiseEvent = Sock.AcceptAsync(e);
            if (!willRaiseEvent)
                AcceptCompleted(Sock, e);
в асинхронном режиме метод будет возвращать true до тех пор пока ты не разорвешь соединение. ИМХО, проверяй, не тестировал.


1) просто сначала ClientNumber был приватным, потом я сделал его паблик, по-этому функция осталась, но не суть. ведь проблема не в этом.
2) в список id добавляется ClientNumber клиентов, которые отключились
private void SendAsync(SocketAsyncEventArgs e)
{
bool willRaiseEvent = Sock.SendAsync(e);
if (!willRaiseEvent) // если не удалось отправить сообщение пользователю, то вероятно, он отключился
{
srv.id.Add(ClientNumber); //добавляем его ClientNumber в список id
ProcessSend(e);
Console.WriteLine("Connection №"+ClientNumber);
}
}
3) А что в них изменить нужно? Вся загвоздка в методе public void SendToAll(string data, int number), если из него убрать проверку
if (Cl.ClientNumber != number), то сервер работает исправно, а вот с этой маленькой проверкой уже брыкается, но мне же нужно отправлять сообщение всем клиентам, кроме того, от которого сообщение пришло.

1
05 марта 2013 года
kot_
7.3K / / 20.01.2000
используй теги форматирования кода.
Что изменить нужно на вскидку мне сказать трудно. Это надо брать и разбираться в твоем коде с отладчиком - а мне есть чем заняться и кроме этого.
Вероятнее всего - сервер не может распознать завершение передачи от клиента - я бы на твоем месте создал бы функцию логгирования и тогда бы ты увидел что происходит непосредственно.
67K
05 марта 2013 года
Chaz
12 / / 22.06.2011
Цитата: kot_
используй теги форматирования кода.
Что изменить нужно на вскидку мне сказать трудно. Это надо брать и разбираться в твоем коде с отладчиком - а мне есть чем заняться и кроме этого.
Вероятнее всего - сервер не может распознать завершение передачи от клиента - я бы на твоем месте создал бы функцию логгирования и тогда бы ты увидел что происходит непосредственно.


окай. чо-та придумаем

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог