いま、Cでかかれた受信側と送信側のプログラムがあります。(送信側はメッセージ(文字列)を送って終了。受信側はその文字列を受け取って、それを表示して終了する、といった簡単なモノです。)(ソケットを使ったモノです。)(コネクションレスです。)
このプログラムを改造して、受信側で送信者のIPアドレスとホスト名を表示するようにしなさ~い♪ という課題がだされたのですが、
Cでは、そういう関数が用意されているのでしょうか?
もしあるとしたら、その関数の使い方など教えてください。
また、メンドウだったら使い方が載っているページなど教えてください。
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の中に
ホスト名が文字列として入ります。
ありがとうございました。
ところで、今お礼を書くにあたって再度Fookyさんの回答を読んでいて、
驚き、そしてヘナヘナとうなだれてしまいました。
>socklen_t fromlen = sizeof(from);
これですっ!これをずっと忘れていてうまくいかなかったんです!
本当に驚きましたよ。Webページを5つほど渡り歩いてやっと気付いたのに。
まさに灯台の下をもう一度見るべきでした。
はじめ、socklen_tというのをみて、なんかまたワケワカランのが、、、
と思って、カル~ク流していたのではないかと思われますが、
まさかそこがソコとワ、、、
なんにしろ、ありがとうございました。そして、お礼がおくれてすみませんでした。
No.1
- 回答日時:
文字列の受信は recvfrom() を使っているのですね?
5番目の引数は何ですか?
こいつから、送信者の IP アドレスが取得できますね。
IP アドレスからホスト名を引き出すには gethostbyaddr() という関数を
使います。
> 関数の使い方など教えてください
多分、unix 上での作成だと思うのですが、一番手軽で確実なのはオンライン
マニュアル(man コマンド)です。例えば、さっきの関数の使い方を調べるには
% man gethostbyaddr
と、やります( % はプロンプトのつもりだから、入力しちゃ駄目ですよ)。
ありがとうございました!
そうです。recvfrom()を使っていたのです。
相手のアドレスが5番目の引数の構造体に入るんでしたか。
しかし、どうもオカシイ。オカシイゾ~~~。
その構造体のメンバを参照しても、%sではnull、%dでは0。
なんでなんだ~~~と苦悩してカタッパシからWebページを読んでいったら、
最後の引数を&lenとすると、recvfromの前に、len = sizeof(構造体)がないと
ダメだったんですね。これに気付くのにどれだけかかったことか、、、
それでずっと悩んでいてお礼が遅れてしまったことをお詫びしておきます。ごめんなさい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Gmail gmail から docomo メールに送信できません 4 2022/06/25 00:41
- その他(メールソフト・メールサービス) サンダーバードでメールが受信されない 10 2022/03/24 17:00
- iPhone(アイフォーン) ショートメールの文字数制限について。 3 2023/01/24 11:37
- au(KDDI) iPhoneSEを使用しています。ショートメールを使用していて入力中に70と表示されるのは70文字ま 1 2022/11/28 23:36
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Android(アンドロイド) スマホ Gメール URLの文字が青く表示されない 4 2023/06/13 19:32
- その他(メールソフト・メールサービス) Windows10付属のメール、なぜ設定が劇的に簡単になったのか? 1 2022/12/16 13:14
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- その他(メールソフト・メールサービス) hotmail タイムアウトエラー 2 2023/04/16 18:48
- サーバー 接続・ログインはできているのにメールが送信できない 2 2022/06/27 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のよるrsh-clientの簡潔...
-
TCP/IP通信時のサーバーからの受信
-
ソケットのクローズについて
-
Winsockで接続待ちタイムアウト...
-
Winsockを使わずにVBでSocketを...
-
UDP通信におけるbind関数について
-
メールサーバへの接続タイムア...
-
ソケットのrecvの戻り値が0
-
WinSockでチャット
-
Socket通信の0バイト受信について
-
WinSockでの通信プログラムがう...
-
Java(クライアント)とC言語(サ...
-
ソケットプログラミングに関す...
-
ポート番号0について
-
WINSOCKのWSACleanupについて
-
UdpClient 送信元のIPアドレ...
-
異なる言語間でのソケット通信...
-
同じLAN内パソコンのIPアドレス...
-
TCP/IP通信型プログラムです。 ...
-
winsockを使った通信での同時接...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
recv関数でフリーズしてしまう
-
Winsockで接続待ちタイムアウト...
-
UDP通信におけるbind関数について
-
エクセル VBA でのCOMポート...
-
Socket通信の0バイト受信について
-
VB6のwinsockでconnectできない
-
ソケットのrecvの戻り値が0
-
ソケットを用いた1対多通信につ...
-
UdpClient 送信元のIPアドレ...
-
ソケットでクライアントのipア...
-
UDP通信する時に、相手にどうや...
-
ソケット通信 同じポート番号...
-
同じLAN内パソコンのIPアドレス...
-
Connectエラーが出てしまう・・...
-
ソケットのクローズについて
-
CreateFile関数でCOMポートが開...
-
異なる言語間でのソケット通信...
-
C言語でHTTP1.1のキープアライ...
-
送信したデータの一部が文字化...
おすすめ情報