Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > клиент серверное приложение по протоколу udp


Автор: lavan 24.7.2012, 10:46
нужно организовать клиент-серверное приложение по протоколу udp.делаю так:
на каждом компе есть общеизвестный udp сокет,который прослушивается отдельным потоком.когда кто-то хочет связаться с этим компом,он посылает пакет на этот сокет,получив пакет,поток прослушивающий этот сокет передает его другому потоку(обработчику),"обработчик" создает для этого соединения отдельный сокет и передает данные о новом сокете запрашивающей стороне,дальнейшее взаимодействие между этими компами происходит по этому сокету. т.е для каждого нового соединения будет создаваться новый,отдельный сокет. 
Правильный ли это подход? 

Автор: Maksys 24.7.2012, 12:07
А если так:
1. клиент посылает запрос на сервер по TCP с открытым для сервера udp портом;
2. в ответ сервер открывает UDP порт и отправляет в ответе на TCP запрос;
3. сервер поделючается к порту указанному в запросе, от клиента, по udp;
4. клиент берет порт в ответе и цепляетс к серверу по udp.

Таким образом у нас полностью рандомная открывалка портов. со сто процентным tcp портом для связи с сервером.
хотя хз. )

Автор: lavan 24.7.2012, 16:15
не,tcp к сожелению использовать нельзя. ну а на счет 
Цитата

со сто процентным tcp портом для связи с сервером.

если я правильно понял,то если первый пакет потеряется,то,я не думаю,что посылка нового пакета будет сильно ресурсоемкой.

Автор: Akina 24.7.2012, 16:33
Цитата(lavan @  24.7.2012,  11:46 Найти цитируемый пост)
Правильный ли это подход?  

Не очень. Либо будут проблемы общения с клиентом за NAT, либо возможны пересечения запросов на коннект и потери запросов.

Обработчик должен отдавать сведения о новосозданном сокете общему сокету, который и будет возвращать клиенту ответ по уже установленному каналу передачи.

Автор: lavan 24.7.2012, 18:48
Цитата

Обработчик должен отдавать сведения о новосозданном сокете общему сокету, который и будет возвращать клиенту ответ по уже установленному каналу передачи.

здесь имеется в виду,что если пришел запрос на соединение,то после открытия нового сокета,передать данные о нем по старому сокету,и тогда сторона инициирующая соединение,дальнейшую связь будет вести по новому сокету?

Автор: Akina 24.7.2012, 20:05
Почти так.
Поступил от клиента запрос на соединение. Открывается новый сокет (на своём порте). Основной сокет отправляет клиенту сведения о новом сокете. Клиент закрывает соединение с основным сокетом, после чего открывает соединение с сокетом, загруженным специально для него. Всё как, например, в пассивном ФТП, только по УДП.
Рекомендую также вместе со сведениями о созданном под клиента совете передавать некую случайную информацию, возврат которой (лучше сложномодифицированной) будет ожидать новосозданный сокет от клиента. Ну так, для доп. проверки подлинности...

Автор: lavan 24.7.2012, 21:04
Спасибо за помощь!

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