• ベストアンサー

TCP/IP通信型プログラムです。 サーバのポート番号をクライアントが

TCP/IP通信型プログラムです。 サーバのポート番号をクライアントが取得するプログラムで、 while(1) { saddr.sin_port=htons(port); port++; fprintf(stdout, "%d\n", port); } のようなのをプログラムのどこに入れれば よいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.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サーバの方です。

pikayuki
質問者

お礼

ありがとうございます。これでやってみます。

その他の回答 (2)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

ANo.1のコードからするとポートスキャンしてサーバが待っているポートを探すのでしょうか。接続できるポートを見つけてもどんなサーバが待っているか判定できないので良い方法とは言えません。 実用的にはサーバを立ち上げて待機ポートが決まったときに何らかの手段で通知するしかありませんが、一般的な方法はありません。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

なぜそのようなことをする必要があるのか、疑問ですが… saddr.sin_port構造体に設定する前…ということで、socket()でソケットを生成する前…ではないでしょうか。 普通、サーバは特定のポートで待ち受けしているわけで、クライアントがサーバ側で待ち受けているポートを「探す」ということはやらないかと思いますが…。 ちなみに、掲示されている例では、当たり前ですがサーバには接続していません。

pikayuki
質問者

補足

サーバ自身がポート番号をランダムに変更する設定となっているからです。聞いた話では、 if(connect(soc, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) { perror("connect"); exit(1); } ここのところをいじればいいそうなのですが・・・。

関連するQ&A

専門家に質問してみよう