Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > Отправить сообщение на несколько UDP-портов


Автор: petlyura 19.8.2013, 10:18
Доброе время, форумчане! smile

Возникла задача: одна программа (пусть сервер) отправляет с какой-то периодичностью (0.1 сек, к примеру) данные другим программкам (клиентам). Короче, делаю это через сокет. Раньше как было: сервер находился на одной машине, а клиенты - по 1 шт. на других (в т.ч. мог и на той, где сервер). Рассылал через мультикаст. Сейчас стал вопрос: а можем ли мы запустить 2-3 клиента на той же машине, где и сервер. Запустить то можем, но кроме первого клиента, остальные на этой машине пока отказываются принимать данные. Вижу проблему в том, что шлю данные на один и тот же порт. Помогите с элегантным решением. Я вижу какое-то топорное: заставить клиентов слушать каждому свой порт, а серверу несколько сокетов использовать для рассылки. А может порт один, а IP-шники у клиентов в рамках одной машины разные? 

Спасибо. Если что написал непонятное, спрашивайте )) 

Автор: Finalist 19.8.2013, 11:09
У тебя клиенты слушают порты? Это уже серверки получаются а не клиенты.. 
Схема такова, что сервер слушает один порт.. клиенты подключаются к нему, и держат соединение. Сервер периодически посылает пакет по открытому сокету.
На одной машине можно поднять таких клиентов очень много, все они подключаться к твоему серверу по одному порту, и все это будет работать.

Автор: petlyura 19.8.2013, 11:14
Цитата(Finalist @ 19.8.2013,  11:09)
У тебя клиенты слушают порты? Это уже серверки получаются а не клиенты.. 
Схема такова, что сервер слушает один порт.. клиенты подключаются к нему, и держат соединение. Сервер периодически посылает пакет по открытому сокету.
На одной машине можно поднять таких клиентов очень много, все они подключаться к твоему серверу по одному порту, и все это будет работать.

Пусть серверки. Я их клиентами назвал, т.к. их много, а раздатчик данных - один.

Я честно не понял дальше. Ну вот я пока запускаю кучу копий "получателей", но лишь первая из них принимает, остальные - нет.


Автор: feodorv 19.8.2013, 13:39
С Майкрософтом будет очень не просто(((

Во-первых, на каждый клиентский сокет должна быть выставлена опция http://msdn.microsoft.com/en-us/library/ms740621%28VS.85%29.aspx (http://pastebin.com/Z4eMHXEj).
Во-вторых, даже это может не гарантировать правильной работы (http://forum.ixbt.com/post.cgi?id=print:26:40732, хотя Бог его знает, как там были инициализированы reuse, inaddr и mreq).

Автор: petlyura 19.8.2013, 15:24
Цитата(feodorv @ 19.8.2013,  13:39)
С Майкрософтом будет очень не просто(((

Во-первых, на каждый клиентский сокет должна быть выставлена опция http://msdn.microsoft.com/en-us/library/ms740621%28VS.85%29.aspx (http://pastebin.com/Z4eMHXEj).
Во-вторых, даже это может не гарантировать правильной работы (http://forum.ixbt.com/post.cgi?id=print:26:40732, хотя Бог его знает, как там были инициализированы reuse, inaddr и mreq).

у меня Win7 32-битная. Заработало с SO_REUSEADDR. Спасибо!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)