![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 7 Всего: 306 |
Он как бэ советует вызвать синхронную версию метода через асинхронный делегат. Однако рьяно не настаивает. |
|||
|
||||
STRELOKBMSTU |
|
||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 11.8.2007 Где: Russia.MR.Moscow( ); Репутация: нет Всего: нет |
по BeginAcceptSocket у нас одновременно запускается несколько слушалок, ошидающих подключения сокета, так? Тогда почему не работает WaitOne здесь:
Ведь WaitOne по идее должен заблокировать текущий цикл до тех пор пока в DoAcceptSocketCallback не будет вызван clientConnected.Set(), разве не так??? И в семафоре если делаю так:
цикл бегает бесконечно, т.е. слушалки постоянно создаются? как в этом случае отрабатывает строчка
|
||||||||||
|
|||||||||||
STRELOKBMSTU |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 11.8.2007 Где: Russia.MR.Moscow( ); Репутация: нет Всего: нет |
По этой строчке у нас создается отдельный поток, который встает в ожидаение сокета??? Или происходит что-то другое? Прост в семафоре у нас ничего не висит, его счетчик пуст, что логично, ведь делегат DoAcceptSocketCallback запускается четко в момент когда приходит запрос от клиента, т.е. возникает какое-то событие??? Оно возникает в основном потоке? и что интересно, то что цикл
бегает бесконечно, т.е. семафор заполнится лишь при наличии нескольких параллельно работающих колбэков... как убрать этот бесконечный цикл? Это сообщение отредактировал(а) STRELOKBMSTU - 13.1.2010, 15:21 |
||||
|
|||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
clientConnected - это ManualReset или AutoReset Event?
А семафор надо немного по другому юзать - ждать перед BeginAcceptSocket, освобождать в начале DoAcceptSocketCallback. |
|||
|
||||
WolfTheGrey |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 21.1.2009 Где: forum.vingrad.ru Репутация: нет Всего: 2 |
А зачем вы вызываете Thread.Sleep() Он не усыпляет поток, а откладывает его в очередь потоков на определенное время. И то не факт, что поток возобновит свою работу именно через этот промежуток времени.
Отведь себе на вопрос: сколько клиентов ты собераешся одновременно обробатывать? и нужен ли тебе весь этот Многпоточный хлам? И вернемся к теме: сервер: имеет структуру с данными о клиенте. Копии структур (клиентов) хранятся в масве. Хранить в структуе можно все, даже его IP адрес. при подключении клиента TcpClient client=listener.AseptTcpClient(); ты уже знаешь его IP и ищеш в базе его данные по его IP. Можешь дождаться когда клиент пришлет свой пароль : string pass=client.Read(); И вернемся к многопоточности: Методы- Read(); и AseptTcpClient() - создают новый поток. (так мне компилятор сказал - когда я расматривал создаваемые потоки в процессе работы програмы) |
|||
|
||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
А зачем ты написал этот кусок текста? Thread.Sleep там закомменчен.
Многопоточный хлам нужен если нужна обрабатывать больше одного клиента одновременно. Думаю, если бы клиент был ровно один, то и топик бы не появился. Разработчики - ленивые существа ![]() В теме не упоминалось что вообще есть какая-то база данных. Перечитай первое сообщение - там подразумевалось хранить инфу о подключенных в данный момент пользователях. Странно при подключении искать там "его IP". Про пароль тоже неожиданно ![]() Компилятор, в процессе работы? хм... а у меня отладчик говорит что AcceptTcpClient не создает поток. И что какой-то выбранный наугад StreamReader.Read - тоже не создает. Мой отладчик сильнее твоего компилятора! ![]() |
|||
|
||||
WolfTheGrey |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 21.1.2009 Где: forum.vingrad.ru Репутация: нет Всего: 2 |
![]() Это сообщение отредактировал(а) WolfTheGrey - 24.1.2010, 03:04 |
||||||||
|
|||||||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
Ок, может быть не дошло, объясню по другому - в этом топике нет ни одного вызова Thread.Sleep. Рихтер наверняка писал и про другие функции, не имеющие отношения к этому топику, не стоит копипастить сюда всю книгу.
Ок, еще раз: 1. В списке держим подключенных пользователей 2. При отключении - удаляем 3. При подключении - ищем в списке по IP 4. И гарантировано не находим... |
|||
|
||||
uranpro |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 571 Регистрация: 7.5.2008 Где: Moscow city Репутация: 1 Всего: 1 |
можно мне плюсик за пост =)
мой сервер, до 4к подключений
используй BinaryFormatter !!! гораздо быстрее и меньше весит. -------------------- I want a perfect soul |
|||
|
||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
uranpro, мелкий баг - чисто теоретически, после 10 ошибок между try и BeginAccept в AcceptCallBack сервер перестанет аццептить вообще ;)
|
|||
|
||||
uranpro |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 571 Регистрация: 7.5.2008 Где: Moscow city Репутация: 1 Всего: 1 |
PashaPash, ага, спасибо, исправим =)
Добавлено через 3 минуты и 43 секунды
-------------------- I want a perfect soul |
|||
|
||||
WolfTheGrey |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 21.1.2009 Где: forum.vingrad.ru Репутация: нет Всего: 2 |
uranpro,
Понравился код, и от меня ему плюсик поставьте! Только я одного не понял, в каком месте происходит массовая рассылка? (тоесть один сказал - все услышали). Если это не предусмотренно, то нужно как то истправлять положение! ![]() |
|||
|
||||
uranpro |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 571 Регистрация: 7.5.2008 Где: Moscow city Репутация: 1 Всего: 1 |
WolfTheGrey, а это уже другой класс =) у меня. вставь в делегат GetData Connections и все, делов минута =)
тело делегата
-------------------- I want a perfect soul |
|||
|
||||
WolfTheGrey |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 21.1.2009 Где: forum.vingrad.ru Репутация: нет Всего: 2 |
uranpro, я так умею, а вот на асинхронных операциях бы!
|
|||
|
||||
uranpro |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 571 Регистрация: 7.5.2008 Где: Moscow city Репутация: 1 Всего: 1 |
вот, без разницы, асинхронная модель или нет
-------------------- I want a perfect soul |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |