C++/Java Sockets автоматично разпределение на портове

Имам сървър (Java) и няколко клиенти (c++), свързани чрез сокети. Бих искал да настроя портовете автоматично. Ако приемем, че IP вече е известен.

От страната на Java мога да направя:

ServerSocket s = new ServerSocket(0);

Така че сега имам произволен безплатен порт на сървъра.

Как мога да разбера от страната на C++ кой порт слуша сървърът?


person anon    schedule 19.08.2011    source източник
comment
Не може да знае номера на порта на сървъра, как би трябвало? Можете да опитате да оставите клиента да сканира портовете на сървърите, но за какво ще е полезно това?   -  person home    schedule 19.08.2011


Отговори (2)


Мисля, че не е възможно, ако искате да установите връзка със сървър, трябва да знаете кой порт слуша сървъра, има програми като nmap, които ви показват списък с отворени портове в сървър, но сървърът може да има много отворени портове по едно и също време и след това, Как да разберете кой е портът, отворен от вашия сървър? и във всеки случай е твърде бавен и неефективен, за да извика външен инструмент, да прочете и анализира изхода му. По каква причина се нуждаете от произволна порт услуга?

Друг вариант може да бъде получаване на отворения сокет от страната на сървъра, извикващ s.getLocalPort(), и изпращане чрез UDP за всеки слушащ възел в мрежата с излъчване и препрограмиране на клиентската страна да слуша в излъчване и когато получи съобщение, проверете дали това е номер на порт и се свържете със сървъра, използвайки този порт.

person jlledom    schedule 19.08.2011
comment
Излъчването е опция, просто имайте предвид, че излъчванията (обикновено) не се препращат от рутери през границите на LAN, така че ще работи само ако всички клиенти са в един и същи LAN сегмент. - person pap; 19.08.2011
comment
@Joan Lledó Не искам да кодирам порта в c++ клиентите, защото не знам колко от тях ще имам. Може да искам да се свържа повече по всяко време. - person anon; 19.08.2011
comment
@pap Всъщност те са на един и същи компютър. Как да направя това да се случи. - person anon; 19.08.2011
comment
@IsocketThis - знаете, че повече от един клиент може да се свърже към един и същ порт, нали? Не е необходимо да имате отделни слушащи портове на сървъра за всеки клиент. И ако динамично добавяте повече слушащи портове към вашия сървър (трудно е да разберете защо, без да знаете какво прави вашето приложение), просто имайте ЕДИН твърдо кодиран порт, към който клиентите се свързват, отговаряйте с всички други активни портове и накарайте клиентите да предприемат подходящи действия. Вижте отговора ми относно услугата локатор. Ще имате нужда ИЛИ от излъчване, ИЛИ от фиксиран, известен порт към услуга за локализиране. Това са наличните опции. - person pap; 19.08.2011
comment
Твърдо кодиране или конфигуриране на фиксирана стойност на сървърния порт, към който да се свържете в клиента, няма да ви попречи да имате произволен брой клиенти. - person soru; 19.08.2011
comment
@IsocketThis като @pap казва, порт и връзка не са едно и също нещо, може да има много връзки в един и същи порт едновременно. Можете да напишете безкраен цикъл, изпълняващ s.accept(), и да напишете нов Runnable клас, който обработва заявката в отделна нишка. - person jlledom; 19.08.2011
comment
И така.. според вас какъв би бил най-добрият начин? просто имате порт, който прави първата комуникация, за да информира за истинския порт? - person anon; 19.08.2011

Не можете, не е надеждно. В IP машината се идентифицира с адрес. Сървър (т.е. услуга) се идентифицира с адрес и порт. Вашите клиенти се нуждаят от някаква форма на „известна услуга“, към която могат да се свържат.

Ако по някаква причина абсолютно искате да имате динамичен порт за слушане, можете да го комбинирате с услуга "локатор" на известен порт. Например, имате уеб услуга/сървлет на стандартния http порт (80). Вашите клиенти се свързват с услугата "locator" (винаги на порт 80) и питат кой порт вашето приложение слуша в момента. Това не е съвсем необичаен модел. RMI работи по подобен начин, когато имате регистър на известен порт. Клиентите се свързват с регистъра и питат за местоположението на крайните точки на RMI.

person pap    schedule 19.08.2011