• ベストアンサー

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

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

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

  • ベストアンサー
  • Fooky
  • ベストアンサー率71% (59/82)
回答No.2

(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というのをみて、なんかまたワケワカランのが、、、 と思って、カル~ク流していたのではないかと思われますが、 まさかそこがソコとワ、、、 なんにしろ、ありがとうございました。そして、お礼がおくれてすみませんでした。

その他の回答 (1)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

文字列の受信は recvfrom() を使っているのですね? 5番目の引数は何ですか? こいつから、送信者の IP アドレスが取得できますね。 IP アドレスからホスト名を引き出すには gethostbyaddr() という関数を 使います。 > 関数の使い方など教えてください 多分、unix 上での作成だと思うのですが、一番手軽で確実なのはオンライン マニュアル(man コマンド)です。例えば、さっきの関数の使い方を調べるには % man gethostbyaddr と、やります( % はプロンプトのつもりだから、入力しちゃ駄目ですよ)。

noname#4530
質問者

お礼

ありがとうございました! そうです。recvfrom()を使っていたのです。 相手のアドレスが5番目の引数の構造体に入るんでしたか。 しかし、どうもオカシイ。オカシイゾ~~~。 その構造体のメンバを参照しても、%sではnull、%dでは0。 なんでなんだ~~~と苦悩してカタッパシからWebページを読んでいったら、 最後の引数を&lenとすると、recvfromの前に、len = sizeof(構造体)がないと ダメだったんですね。これに気付くのにどれだけかかったことか、、、 それでずっと悩んでいてお礼が遅れてしまったことをお詫びしておきます。ごめんなさい。

関連するQ&A