Добрый день. Пишу сетевой чат, и по этому поводу возникли вопросы:
Имеем: сервер с рабочими потоками для каждого клиента, принимает фразы от клиента и посылает фразы других клиентов. Каждый поток как-то должен сообщать основному что есть новые данные, точно так же как и основной поток должен сообщать рабочим, что надо что-то отослать. Соотсветственно эти события независимы.Как это правильнее реализовать, т.е. каким способом, через таймер ли, TCP или UDP, блокирующие/неблокирующие вызовы?
На VC++6/MFC, Winsock.
Заранее спасибо за ответы.
Re: Работа с Winsock, или как правильно написать чат.
Здравствуйте Bers, Вы писали:
B>Добрый день. Пишу сетевой чат, и по этому поводу возникли вопросы: B>Имеем: сервер с рабочими потоками для каждого клиента, принимает фразы от клиента и посылает фразы других клиентов. Каждый поток как-то должен сообщать основному что есть новые данные, точно так же как и основной поток должен сообщать рабочим, что надо что-то отослать. Соотсветственно эти события независимы.Как это правильнее реализовать, т.е. каким способом, через таймер ли, TCP или UDP, блокирующие/неблокирующие вызовы?
На правильность не претендую, но я бы делал так:
1. Использовал бы TCP (просто из-за надежности и удобства).
2. Работал бы с асинхронными сокетами, то есть обошелся бы максимум двумя потоками.
Один для пользовательского интерфейса приложения, другой для сообщений от winsock.
Большое количество потоков не всегда есть плюс, а головная боль с обеспечением их корректного взаимодействия точно будет.
К сожалению, в действительности все выглядит иначе, чем на самом деле.
Re: Работа с Winsock, или как правильно написать чат.
Здравствуйте Bers, Вы писали:
B>Добрый день. Пишу сетевой чат, и по этому поводу возникли вопросы: B>Имеем: сервер с рабочими потоками для каждого клиента, принимает фразы от клиента и посылает фразы других клиентов. Каждый поток как-то должен сообщать основному что есть новые данные, точно так же как и основной поток должен сообщать рабочим, что надо что-то отослать. Соотсветственно эти события независимы.Как это правильнее реализовать, т.е. каким способом, через таймер ли, TCP или UDP, блокирующие/неблокирующие вызовы?
B>На VC++6/MFC, Winsock. B>Заранее спасибо за ответы.
На сервере, для всех сокетов используй один поток.
Клиентские сокеты храни в списке. Соответственно в том же потоке эти
клиентские сокеты опрашивай, на предмет получения событий. Ну и дальше командуй ими.
А протокол тебе по барабану, используй любой. У тебя же не технологический процесс
на атомной станции. Хотя лучше TCP. C переконекчиванием будет меньше проблем.