2011-08-19 13 views
0

私はサーバー(Java)とクライアント(C++)をソケットで接続しています。 ポートを自動的に設定したいと思います。 IPがすでにわかっていると仮定します。 C++/Javaソケット自動ポート割り当て

は、Java側では私が作ることができます。

ServerSocket s = new ServerSocket(0); 

は、だから今私は、サーバー上のランダムな空きポートをしました。

C++側でどのようなポートがリッスンしているのですか。

+0

サーバのポート番号を知ることはできません。どうすればよいですか?あなたは、クライアントがサーバーのポートをスキャンできるようにすることができますが、それは何のために良いはずですか? – home

答えて

3

サーバとの接続を確立するには、どのポートがリッスンしているのか知っていなければならないと思うのですが、nmapのようなプログラムがあります。サーバーは同時に多くの開かれたポートを持つことができますし、サーバーによって開かれたポートはどのように分かりますか?いずれにしても、外部ツールを呼び出すためには速度が遅すぎ、効率が悪いため、出力を読み込んで解析する必要があります。どのような理由でランダムポートサービスが必要ですか?

他のオプションは、サーバ側でs.getLocalPort()を呼び出すオープンソケットを取得し、ブロードキャストでネットワーク内の任意のリスニングノードに対してUDP経由で送信し、クライアント側でブロードキャストおよび受信時にリスンするそのポート番号を確認し、そのポートを使用してサーバーに接続します。

+1

ブロードキャストはオプションです。ブロードキャストは(通常は)LAN境界を越えてルータによって転送されないので、すべてのクライアントが同じLANセグメントにある場合にのみ動作することに留意してください。 – pap

+0

@JoanLledó私はどれくらい多く持っているのか分からないので、私はC++クライアントのポートをハードコードしたくありません。私はいつでもより多くのものをつなぎたいかもしれません。 – anon

+0

@pap実際には同じコンピュータにあります。どうすればそれが起こるのですか? – anon

0

あなたは、信頼性の高い方法ではありません。 IPでは、マシンはアドレスで識別されます。サーバ(すなわち、サービス)は、アドレスおよびポートによって識別される。クライアントには、知られているサービスの形式が必要です。

何らかの理由で、ダイナミックリスニングポートを絶対に持ちたい場合は、それを既知のポートの「ロケータ」サービスと組み合わせることができます。たとえば、標準のhttpポート(80)にWebサービス/サーブレットがあるとします。クライアントは「ロケータ」サービス(常にポート80)に接続し、アプリケーションが現在リッスンしているポートを尋ねます。これはまれなパターンではありません。 RMIの動作は、既知のポートにレジストリがある場合と同様の方法です。クライアントはレジストリに接続し、RMIエンドポイントの場所を尋ねます。

+0

私はそういうことを避けたいと思っていました。しかし、それが唯一の解決策であれば... – anon

関連する問題