- 締切済み
相手のIPアドレスを知る手段
C言語で、サーバーソケット(accept)でコネクションを確立した後、 接続された相手のIPアドレスを知る手段はありますでしょうか。 Javaでは、java.net.ServerSocketクラスの、getInetAddressという メソッドを利用して知ることができるのですが、C言語ではどうして いいのか分かりません。ご存知の方ご教授よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- punchan_jp
- ベストアンサー率55% (155/280)
補足見ました。すみません、ちょっと勘違いしてたかもしれません。下のかた が書いているように、accept()時にsock_addr構造体へのポインタを渡して得 られる情報がクライアント側の情報ですね。accept()で作られたソケットはサー バのものなので、getsockname()では自分の情報しか得られないみたい。 失礼しました。
- toysmith
- ベストアンサー率37% (570/1525)
acceptの第2引数ではダメなんですか?
- hyde-la
- ベストアンサー率28% (42/146)
acceptの引数にscokaddr構造体へのポインタがありますよね。 ここにアドレス等の情報を受けますので、 これをsockaddr_in構造体へキャストして、 sin_addrメンバ変数を調べればよいかと。
- punchan_jp
- ベストアンサー率55% (155/280)
getsockname() というシステムコールを使います。socketは非常に柔 軟でインターネット以外のネットワークにも対応していますから、 その先がやや手間です。 このシステムコールで得られた sockaddr という構造体の sa_family というメンバーを調べて、これが AF_INET だったら IP 接続であり、sockaddr_in という構造体にキャストすると、 sin_port と sin_addr にポート番号とIPアドレスが得られます。 sin_addr を inet_ntoa() に与えれば文字列標記も得られます。
お礼
なるほど。お教えの通り実験したら みごとにできました。できないものと思い込んで いたらJavaで出来たので、無知な自分にがっかりです。 かなり詳細に教えていただきましてありがとうございました。助かりました。
補足
すみません。本日改めて実験してみたところ、 getsocknameで得られるsockaddrの内容は サーバのIPアドレスとポート番号ではないでしょうか。 acceptの時点で得られるsockaddrには クライアント側のIPアドレスとポート番号が 入っていたのですが。。