OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

Cにおける通信プログラミングの問題のコトですが。

  • 困ってます
  • 質問No.101984
  • 閲覧数111
  • ありがとう数3
  • 気になる数0
  • 回答数2
  • コメント数0

いま、Cでかかれた受信側と送信側のプログラムがあります。(送信側はメッセージ(文字列)を送って終了。受信側はその文字列を受け取って、それを表示して終了する、といった簡単なモノです。)(ソケットを使ったモノです。)(コネクションレスです。) 
このプログラムを改造して、受信側で送信者のIPアドレスとホスト名を表示するようにしなさ~い♪ という課題がだされたのですが、
Cでは、そういう関数が用意されているのでしょうか?
もしあるとしたら、その関数の使い方など教えてください。
また、メンドウだったら使い方が載っているページなど教えてください。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル9

ベストアンサー率 71% (59/82)

(UNIX系OSでの作成を仮定しています)
ipのmanページも見ておいた方がいいと思います。

% man ip

recvfrom()のmanページでは、recvfrom()の
引数は、

recvfrom(int s, void *buf, size_t len, int flags,
     struct sockaddr *from, socklen_t *fromlen);

となっていて、fromに発信元アドレスが入る、という形だと
思います。しかし、sockaddr構造体はネットワークプロトコル
ごとに使い分けます。(実際はインターネットプロトコルしか
使ったこと無いですが)

で、インターネットプロトコル用のsockaddr構造体
であるsockaddr_in構造体に関する記述が、
ipのmanページに書いてあります。
(ただしこれはLinuxの場合。手元のSunOSでは
man 4f inetに、IRIXではman 7 inetに
記載されていました。)

recvfrom()のコールの仕方としては、

struct sockaddr_in from;
socklen_t fromlen = sizeof(from);
recvfrom(s, buf, len, 0, (struct sockaddr *)&from, fromlen);

の様に、sockaddr_in構造体へのポインタをsockaddr構造体への
ポインタにキャストしたものを引数に指定します。

fromに入った接続元ホストのデータをホスト名へ変換するには、

hostent *hstent;
hstent = gethostbyaddr((char *)&from.sin_addr, sizeof(from.sin_addr), AF_INET);

とすることで、hstent->h_nameの中に
ホスト名が文字列として入ります。
お礼コメント
noname#4530

ありがとうございました。

ところで、今お礼を書くにあたって再度Fookyさんの回答を読んでいて、
驚き、そしてヘナヘナとうなだれてしまいました。

>socklen_t fromlen = sizeof(from);

これですっ!これをずっと忘れていてうまくいかなかったんです!

本当に驚きましたよ。Webページを5つほど渡り歩いてやっと気付いたのに。
まさに灯台の下をもう一度見るべきでした。

はじめ、socklen_tというのをみて、なんかまたワケワカランのが、、、
と思って、カル~ク流していたのではないかと思われますが、
まさかそこがソコとワ、、、

なんにしろ、ありがとうございました。そして、お礼がおくれてすみませんでした。
投稿日時 - 2001-07-12 21:50:03
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル14

ベストアンサー率 50% (1122/2211)

文字列の受信は recvfrom() を使っているのですね? 5番目の引数は何ですか? こいつから、送信者の IP アドレスが取得できますね。 IP アドレスからホスト名を引き出すには gethostbyaddr() という関数を 使います。 > 関数の使い方など教えてください 多分、unix 上での作成だと思うのですが、一番手軽で確実なのはオンライン マニュアル(ma ...続きを読む
文字列の受信は recvfrom() を使っているのですね?

5番目の引数は何ですか?
こいつから、送信者の IP アドレスが取得できますね。

IP アドレスからホスト名を引き出すには gethostbyaddr() という関数を
使います。

> 関数の使い方など教えてください

多分、unix 上での作成だと思うのですが、一番手軽で確実なのはオンライン
マニュアル(man コマンド)です。例えば、さっきの関数の使い方を調べるには

% man gethostbyaddr

と、やります( % はプロンプトのつもりだから、入力しちゃ駄目ですよ)。
お礼コメント
noname#4530

ありがとうございました!
そうです。recvfrom()を使っていたのです。
相手のアドレスが5番目の引数の構造体に入るんでしたか。

しかし、どうもオカシイ。オカシイゾ~~~。
その構造体のメンバを参照しても、%sではnull、%dでは0。
なんでなんだ~~~と苦悩してカタッパシからWebページを読んでいったら、
最後の引数を&lenとすると、recvfromの前に、len = sizeof(構造体)がないと
ダメだったんですね。これに気付くのにどれだけかかったことか、、、

それでずっと悩んでいてお礼が遅れてしまったことをお詫びしておきます。ごめんなさい。
投稿日時 - 2001-07-12 21:37:44
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ