• 締切済み

相手のIPアドレスを知る手段

C言語で、サーバーソケット(accept)でコネクションを確立した後、 接続された相手のIPアドレスを知る手段はありますでしょうか。 Javaでは、java.net.ServerSocketクラスの、getInetAddressという メソッドを利用して知ることができるのですが、C言語ではどうして いいのか分かりません。ご存知の方ご教授よろしくお願いします。

みんなの回答

回答No.4

補足見ました。すみません、ちょっと勘違いしてたかもしれません。下のかた が書いているように、accept()時にsock_addr構造体へのポインタを渡して得 られる情報がクライアント側の情報ですね。accept()で作られたソケットはサー バのものなので、getsockname()では自分の情報しか得られないみたい。 失礼しました。

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.3

acceptの第2引数ではダメなんですか?

  • hyde-la
  • ベストアンサー率28% (42/146)
回答No.2

acceptの引数にscokaddr構造体へのポインタがありますよね。 ここにアドレス等の情報を受けますので、 これをsockaddr_in構造体へキャストして、 sin_addrメンバ変数を調べればよいかと。

回答No.1

getsockname() というシステムコールを使います。socketは非常に柔 軟でインターネット以外のネットワークにも対応していますから、 その先がやや手間です。 このシステムコールで得られた sockaddr という構造体の sa_family というメンバーを調べて、これが AF_INET だったら IP 接続であり、sockaddr_in という構造体にキャストすると、 sin_port と sin_addr にポート番号とIPアドレスが得られます。 sin_addr を inet_ntoa() に与えれば文字列標記も得られます。

tonbokun
質問者

お礼

なるほど。お教えの通り実験したら みごとにできました。できないものと思い込んで いたらJavaで出来たので、無知な自分にがっかりです。 かなり詳細に教えていただきましてありがとうございました。助かりました。

tonbokun
質問者

補足

すみません。本日改めて実験してみたところ、 getsocknameで得られるsockaddrの内容は サーバのIPアドレスとポート番号ではないでしょうか。 acceptの時点で得られるsockaddrには クライアント側のIPアドレスとポート番号が 入っていたのですが。。