プロが教えるわが家の防犯対策術!

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

よいのでしょうか?

A 回答 (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サーバの方です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/04/24 07:25

ANo.1のコードからするとポートスキャンしてサーバが待っているポートを探すのでしょうか。

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

なぜそのようなことをする必要があるのか、疑問ですが…



saddr.sin_port構造体に設定する前…ということで、socket()でソケットを生成する前…ではないでしょうか。

普通、サーバは特定のポートで待ち受けしているわけで、クライアントがサーバ側で待ち受けているポートを「探す」ということはやらないかと思いますが…。

ちなみに、掲示されている例では、当たり前ですがサーバには接続していません。

この回答への補足

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

補足日時:2010/04/23 08:02
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!