• 締切済み

相手の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アドレスとポート番号が 入っていたのですが。。

関連するQ&A

  • ソケット通信で

    ServerSocketのaccept()で接続を受け付けるときに、 指定したIPアドレスからの接続を拒否することはできますか? このメソッドの説明に 新しいソケット s が作成され、セキュリティマネージャが存在する場合、セキュリティマネージャの checkAccept メソッドが、引数として s.getInetAddress().getHostAddress() および s.getPort() を指定して呼び出され、この操作の実行が許可されていることを確認します。と あるんですがどこでアクセス拒否を設定したらいいのかわかりません。

  • JAVAのソケット通信の接続数について

    JAVAのソケット通信の接続数について ServerSocket server= new ServerSocket( port ); server.setSoTimeout( 4000 ); Socket socket = server.accept();//クライアントからの接続をまつ 以上のコードを使っていますが、クライアントからの接続数を調べる方法はないでしょうか?

    • ベストアンサー
    • Java
  • IPアドレスについて教えて下さい。

    1台のPCを普段は社のネットワーク(Bクラス)に接続して、業務上必要なときにIPアドレスを変更(Cクラス)して、Ghostサーバ(IPアドレスはCクラス)として使用しています。 が、その都度その都度、IPアドレスを変更(BクラスからCクラス)するのはとても面倒なので、IPアドレスを変更せずに使用することはできないものでしょうか? 簡単に言えば、PCのIPアドレスはBクラスのままで、Norton Ghostを起動して、他のPCにGhostイメージを流し込む作業がができないかということです。 宜敷くお願いします。

  • ソケットにおけるメッセージの送受信について

    いつもお世話になっています。 ソケットに関して質問します。 下記の手順でソケットを使用したいと考えています。 クラスAとクラスBが存在する。 1)クラスA:ソケット通信でメッセージ送信 2)クラスB:ソケット通信によるメッセージを取得 3)クラスB:ソケット通信で返信する 4)クラスA:ソケットによるメッセージを再取得する このとき、クラスAがクラスBによるメッセージ再信が、30秒以内にこなければ、ソケットを閉じる それにあたってソースを1クラスで実行できるよう書き変えたいのですが、どうも上手くいきません。 実行したいメソッド手順が ソケットを開く openSocket ソケットにメッセージ送信 sendMsg ・・・1と3はこのメソッドを使用 メッセージ取得 getMsg ・・・2と4はこのメソッドを使用 ソケットを閉じる closeSocket の順です。 自分で一度考えてみたソースは以下です。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; public class Messaneger{ private Socket socket; private BufferedReader in; // ソケットを開く public void openSocket() { ServerSocket serverSocket; try { serverSocket = new ServerSocket(5555); System.out.println("クライアントからの接続をポート5555で待ちます"); // クライアントからの接続を待ちます Socket socket = serverSocket.accept(); System.out.println(socket.getInetAddress() + "から接続を受付ました"); // 出力ストリームを取得 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 入力ストリームを取得 in = new BufferedReader( new InputStreamReader( socket.getInputStream())); } catch (IOException e) {} } //ソケットを閉じる public void closeSocket() { try { socket.close(); } catch (IOException e) {} } /** * ソケット通信でメッセージを送信 * @param 送信するメッセージ */ public void setMsg(String sendMsg) { try { socket = new Socket("localhost", 5555); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 入力ストリームを取得 in = new BufferedReader( new InputStreamReader( socket.getInputStream())); //サーバーにメッセージ送信 out.println( sendMsg ); //送信メッセージdata System.out.println(sendMsg); } catch (IOException e) {} } /** * ソケット通信でメッセージを取得 * @return msg サーバーに渡されたメッセージ */ public String getMsg() { String getMsg = ""; BufferedReader in; try { in = new BufferedReader( new InputStreamReader( socket.getInputStream())); System.out.println(in.readLine()); } catch (IOException e) {} return getMsg; } } 参考URL:http://www.hellohiro.com/socket.htm 宜しくお願いします。

  • IPアドレスについて教えて下さい。

    IPアドレスについて教えて下さい。(クラスCを例にします) クラスCは、192.0.0.0~223.255.255.255の範囲でIPアドレスが割り当てられますが、 192.0.0.0~192.167.255.255→グローバル 192.168.0.0~192.168.255.255→プライペート 192.169.0.0~223.255.255.255→グローバル ということなのでしょうか? すみません。よろしくお願いします。

  • IPアドレスは唯一のアドレス?

    いま、C言語でネットワークプログラミングを勉強しているのですがちょっと疑問に思ったことがあります。 クライアント側からサーバーにIPアドレスを使って接続しローカルの環境では上手く動きました。 しかし、例えばこれを友達などの家でサーバを起動してもらって、自分の家から接続できるんですか? IPアドレスはそれぞれのPCの唯一のアドレスというけれで、実際にはルータを使っていれば同じIPはたくさんあるだろうし。 接続できるとすれば一体どういう仕組みになっているのでしょうか?出来ないならどういう風にすれば出来るのですか?プログラムの方で何かしなくてはならないのでしょうか

  • 43億あるIPアドレスのうちなぜ2000万個以下しか使わないのですか?

    ネットでクラスというものを調べたら、それぞれのクラスにおいて A  10.0.0.0- 10.255.255.255 B  172.16.0.0- 172.31.255.255 C 192.168.0.0-192.168.255.255 のように、IPアドレスが存在することがわかりました。 計算すると、 クラスAは256^3で約1600万のIPアドレスを持ち、 クラスBは16*256*256で約100万のIPアドレスを持ち、 クラスCは256*256で約7万のIPアドレスを持つことが計算できました。 それぞれを合計しても2000万個に満たないです。 なぜこんな無駄な使い方をするのでしょうか?

  • IPアドレスの割り振り方

    IPアドレスの割り振りについて教えてください。 左端8ビットが、 クラスA(1~127)、クラスB(128~191)、クラスC(192~223),クラスD(224~239)、クラスE(240~255)と分類されていることを知ったのですが、クラスごとの分類分けされているのは何故なのでしょうか? また、家のPCでは IPアドレス 192.168.〇〇〇.〇〇〇となっています。 家で使うPCは192.168~始まっているのですが、 192.168~以外に200.168~などのIPアドレスを振ることはできるのでしょうか?

  • グローバルIPアドレスのクラスCとDの分け方

    2つのグローバルIPアドレスのクラスCが同じで クラスDだけが違うということは、 同じISPでサーバ(ゲートウェイ)が違うということなのでしょうか? つまり、CとDの分け方はどのようにして出来るのでしょうか?

  • TCP/IP(IPアドレス)について

    IPアドレスについて勉強しようと思っています。 最近、プライベートアドレスとグローバルアドレスの意味が分かってきたレベルです。(外部への接続となると、グローバルアドレスへ変換されていたんですね。) IPアドレスの設定値とかまったくわかりません。 クラスがA・B・Cあって、ネットワークアドレス、ホストアドレス・・ サブネットマスクについても??という状態。 本を買ってみたものの、10進数とか2進数への変換とか意味がさっぱり! この手のわかりやすいサイトとかありますでしょうか? そもそも、社内にサーバーがありこんな私でも一応管理者なんです。(小さな会社ですけど) いつも業者任せで、これでは・・と思い、IPアドレス(TCP/IP)については知識がなければと強く感じています。 お願いします。