- ベストアンサー
TCP/IP通信型プログラムです。 サーバのポート番号をクライアントが
TCP/IP通信型プログラムです。 サーバのポート番号をクライアントが取得するプログラムで、 while(1) { saddr.sin_port=htons(port); port++; fprintf(stdout, "%d\n", port); } のようなのをプログラムのどこに入れれば よいのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
while((ntohs(saddr.sin_port) <= 0xffff) && (connect(soc, (struct sockaddr *)&saddr, sizeof(saddr)) == SOCKET_ERROR)) { saddr.sin_port = htons((ntohs(saddr.sin_port) + 1)); } こんなところでしょうか。 whileループに入る前に、スキャンするポートの開始値をsaddr.sin_portに設定しておく必要があります。 # 勿論、それ以外のメンバ変数も適切に設定してある必要があります。 65535番ポートまで接続を試行し、『最初に接続できた』ところでループから抜けるでしょう。 が…… >サーバ自身がポート番号をランダムに変更する設定となっているからです。 というのは設計ミスとしか思えませんが。 上記の方法では接続できるまでポート番号を変えながら試行しますけど、connect()がエラー返却するのに時間が掛かる場合、全ポートの試行が終わるまでにどれだけ掛かるやら…。 接続できたとしても、#2さんが指摘しているとおりソレが目的のサーバプログラムが待ち受けしているポートかは不明です。 例えば同じマシンでWebサーバが動作していて80番で待ち受け中に、目的のサーバが7000番とかで待っていた場合、先に接続するのはWebサーバの方です。
その他の回答 (2)
- rinkun
- ベストアンサー率44% (706/1571)
ANo.1のコードからするとポートスキャンしてサーバが待っているポートを探すのでしょうか。接続できるポートを見つけてもどんなサーバが待っているか判定できないので良い方法とは言えません。 実用的にはサーバを立ち上げて待機ポートが決まったときに何らかの手段で通知するしかありませんが、一般的な方法はありません。
- Wr5
- ベストアンサー率53% (2173/4061)
なぜそのようなことをする必要があるのか、疑問ですが… saddr.sin_port構造体に設定する前…ということで、socket()でソケットを生成する前…ではないでしょうか。 普通、サーバは特定のポートで待ち受けしているわけで、クライアントがサーバ側で待ち受けているポートを「探す」ということはやらないかと思いますが…。 ちなみに、掲示されている例では、当たり前ですがサーバには接続していません。
補足
サーバ自身がポート番号をランダムに変更する設定となっているからです。聞いた話では、 if(connect(soc, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { perror("connect"); exit(1); } ここのところをいじればいいそうなのですが・・・。
お礼
ありがとうございます。これでやってみます。