• ベストアンサー

MSDNがgethostbynameではなくgetaddrinfoを使えと言うわけ

gethostbyname関数は無駄がなく思えるのですが、MSDNでは「これからはgetddrinfoを使っていけ」みたいなことをgethostbyname関数の説明に加えています。 gethostbyname関数もIPの長さは可変に対応してますよね? 何の都合があってgetaddrinfoを使わなければいけないのでしょうか。 getaddrinfoって、なんだかややこしい割に得られる情報が大したことない(他の手段で簡単に得られる)し、ai_canonnameなど、指定した情報がそのまま格納されるだけな気がしますが・・。

  • ggaogg
  • お礼率86% (209/243)

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

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

最大の理由は、gethostbyname が返す領域のメモリが非常に扱いにくいからだったかと。 古いC言語の関数にありがちな一見簡単に使えるが危険も多い用法で、戻り値の格納領域を gethostbyname の内部で持つので、この領域の開放タイミングがライブラリ提供側には判断ができず。 ユーザ側での排他制御を前提としたり、必要に応じて結果をコピーする必要がでたり、スレッドセーフティ等の面で問題が見えてきたので、これが getaddrinfo が新しく策定された動機のはずです。

ggaogg
質問者

お礼

回答どうもありがとうございます。 あぁHOSTENT構造体は1つしか作成できないのに対してADDRINFO構造体はいくつでも作成可能というメリットはあるみたいですね。 でも、ソースを見るときに見にくいことは見にくいですよねぇ・・。

関連するQ&A

  • MSDNライブラリのダウンロード

    テキスト編集ツールでWin32 APIを使ったプログラミングをしているのですが、そのときにいつもMSDN Libraryで関数を毎回調べながら作業を行っています。 なのでネットに繋げない環境ではMSDN Libraryに接続できなく、作業ができません。(けっこうそういう環境でPC触ることも多いです) ちょっと見てみたんですけど、一括ダウンロードというのはMSDN Libraryでは見つけれませんでした(情報量が多すぎてどうやって探せばいいのかわからないというのが本音です)。 MSDN Libraryの情報の一括ダウンロードなどは提供されていないのでしょうか? また、そうだとした場合、オフラインで作業をする手段はありますか?あったら教えてください。

  • array関数に指定する引数が可変個の場合どうしたらよいでしょうか?

    array関数に指定する引数が可変個の場合どうしたらよいでしょうか? arrValue = Array("a","b","c") 上記のように、array関数を使ってvariant型の変数に格納したいのですが、 arrayに指定する個数が可変個の場合、どうやったらよいのでしょうか? arrayに指定する値は、他のプログラムによって 配列型変数"aaa"に格納済みです。 aaaに格納される配列数は可変個のため、 dim aaa() as string で定義して、取得できた数によって Redim で再定義しています。 aaaの配列数に応じて、if文などで、 配列数が1個だったら、arrValue = Array(aaa(0)) 配列数が2個だったら、arrValue = Array(aaa(0),aaa(1)) とすればできないことはないのですが、何個までを想定すればよいかも わからないため、困っています。 何かよい方法はないでしょうか?

  • getaddrinf()で取得したIPアドレス表示

    お世話になります。 C言語でソケット通信の勉強中です。 CentOS6.4を使っています。 LIST1は、 IPアドレスではなくホスト名がコマンド引数で渡されたとき、 getaddrinfo()でIPアドレスを取得して、 sendto()でサーバにメッセージを送信するだけの、 クライアントのプログラムです。 このLIST1のudp通信自体は上手くいくのですが、 終わりの方で、 getaddrinfo()で取得したIPアドレスを inet_ntoa()を使って文字列表示しようとすると、 セグメンテーション違反です (コアダンプ)となってしまいます。 inet_ntoa()の引数が疑わしく、 いろいろ渡し方を変えたり、参照方法を変えたりしてみたのですが、、 なかなか解決しません。 ちゃんと、192.168.12.1とか表示するにはどうすれば良いでしょうか? ■LIST1 #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <errno.h> int main(int argc,char *argv[]){ int sock; struct addrinfo hints,*res; int n; int err; if(argc != 2){ fprintf(stderr,"Usage : %s dst \n",argv[0]); return 1; } /* IP アドレス表記+ホスト名両方に対応 */ memset(&hints,0,sizeof(hints)); hints.ai_family = AF_UNSPEC; /* IPV4 IPV6 両方に対応 */ hints.ai_socktype = SOCK_DGRAM; err = getaddrinfo(argv[1],"12345",&hints,&res); if(err != 0){ perror("getaddrinfo"); printf("getaddrinfo %s\n",strerror(errno)); printf("getaddrinfo : %s \n",gai_strerror(err)); return 1; } sock = socket(res->ai_family,res->ai_socktype,0); if(sock < 0){ perror("socket"); return 1; } { const char *ipverstr; switch (res->ai_family){ case AF_INET: ipverstr = "IPv4"; break; case AF_INET6: ipverstr = "IPv6"; break; default: ipverstr = "unknown"; break; } printf("ipverstr = %s\n ",ipverstr); } n = sendto(sock,"HELLO",5,0,res->ai_addr,res->ai_addrlen); //n = sendto(sock,"HELLO", 5, 0,(struct sockaddr *)addr, sizeof(addr)); if(n<1){ perror("sendto"); { } return 1; } printf("############ finish !! #######\n"); close(sock); freeaddrinfo(res); struct sockaddr_in *addr; addr = (struct sockaddr_in *)res->ai_addr; printf("inet_ntoa(in_addr)sin = %s\n",inet_ntoa((struct in_addr)addr->sin_addr)); return 0; }

  • LastDLLErrorのエラー番号一覧がある場所を知りたい。

    msdn「Microsoft Office XP Developer DLL 関数の呼び出し後のエラー情報を取得する」 を見ますと、LastDLLError プロパティを使用するには、各エラーに対応するエラー番号を知る必要があります。 と記載されていますが、この一覧表のある場所へたどりつけません。 ご存知の方宜しくお願いいたします。 (Visual Basic6.0です。)

  • ITです。早速ですがwinsockでURLを指定した接続確認をしたいの

    ITです。早速ですがwinsockでURLを指定した接続確認をしたいのですが、うまくいきません。 下記のソースで、URLを指定してinet_addr関数呼び出すと-1、 gethostbynameを呼び出すと0が却ってきてしまい、うまく接続出来ません。 IPアドレス(127.0.0.1)を指定すれば、上記の関数は成功するのですが。 URLからIPアドレスの変換方法が解りません。 どうか助けて下さい。 int main(int argc, char* argv[]) { WSADATA wsaData; sockaddr_in server; SOCKET sock; long err; hostent *host; char *url = "http://www.yahoo.co.jp"; // winsock2の初期化 err = WSAStartup(MAKEWORD(2,0), &wsaData); if (err != 0) { printf("WSAStartup error = %d\n", err); return(-1); } // ソケットの取得 sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { printf("socket error = %d\n", WSAGetLastError()); return(-1); } // IPアドレスの取得 memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(80); server.sin_addr.S_un.S_addr = inet_addr(url); if (server.sin_addr.S_un.S_addr == -1) { host = gethostbyname(url); if (host == NULL) { printf("host not found host = %d\n", WSAGetLastError()); return(-1); } }

  • 現在、EXCEL2003で、book同士をvlook関数で参照していま

    現在、EXCEL2003で、book同士をvlook関数で参照しています。 book1:PC管理台帳.xls (PCと利用者の紐付け) book2:IP管理台帳.xls (IPとPCの紐付け。ただし、PC以外の用途も管理--出張者用など-) book1のユーザ情報(PCと利用者の紐付け) PCとIPの組み合わせが変わるたびに、book2を更新しています。 今後、book1を、Access2003に移行するのですが、そうすると、今までbook1を参照することで、 入手できた、IPとPC利用者情報の一覧ができなくなります。 そこで質問です。 Excelのvlookup関数の対象範囲に、ACCESSのクエリを指定することはできるでしょうか? もしくは、ACCESSの作りこみで、一定のファイルに対してPC番号とユーザ情報のクエリを exportするメニュ-をつくり、上書き更新する、という手段を素人ながら考えています。 基本的な質問かもしれませんが。。この課題へのアドバイスなどいただければ幸いです。

  • SetBkModeやSetTextColorは…

    3Dゲームのソリューションとは別の(Windows XP以前にも対応する)アプリケーションを作っているときに思った事なのですが GDIで msdnのSelectObjectの解説には (http://msdn.microsoft.com/ja-jp/library/cc410576.aspx) ------------- この関数は、指定されたのと同じタイプで、それまで選択されていたオブジェクトを返します。アプリケーションは新しいオブジェクトを使い終えたら、必ず元の(既定)オブジェクトに置き換えるべきです。 ------------- と書いてあるのですが SetBkModeやSetTextColorについてはそう言った表記がありません。 実際には、これらはReleaseDCやEndPaintの前に初期状態に戻すべきなのでしょうか? 戻さなくても全く問題はないでしょうか?

  • コロンを挟ませない表記方法

    下記ページの(c)欄への解答を選ぶ為の選択肢には、 『最小関数』と『最大関数』とが登場していますね。 http://情報処理試験.jp/FE21b-pm/t13.html 但し、それ等の関数の表現の扱われ方が、 MicrosoftOfficeのExcelの『min関数』・『max関数』の場合とは違う様に、 私には思われました。 従いまして、もし是からの本試験でそれ等が適用されましたら、 ルールを先に理解していませんと、 其の場で無駄な時間の浪費さえもが強いられ兼ねませんから、 そういう展開の可能性の払拭の為に、教えて下さい。 ■基本情報技術者試験の表計算問題で採用されている『最小関数』・『最大関数』の場合にも、 括弧の中では『Cell範囲』が指定されているのでしょうか?

  • エクセルで、「1つ前のシート」を指定したいのです。

    エクセルで、「1つ前のシート」を指定したいのです。 実際はマクロを使って次々に新しいシートを作っていくという作業の中での話です。 以下の式の'●●●●'の部分を「1つ前のシート」に指定したいのですが、うまくいきません。 =IF(P9>'●●●●'!K15,G1,'●●●●'!J15) ちなみにシート名は任意の「文字列」で特に規則性はありません。 また、参照したい「1つ前のシート」の名前は変数「TW」に格納されています。 ということで「関数」でも「マクロ」でもどちらでも対応可能です。 初歩的な質問ばかりで申し訳ないのですが、ご回答よろしくお願いいたします。 

  • msdnとはなんですか

    yahooオークションでoffice 2007の認証キーを購入し試用品をダウンロードし認証キーを入力しライセンス認証を行ったのですがプロダクトIDを入力してマイクロソフトの無償サポートを受けようとしたのですがエラーになりMSDNの会員登録が必要と言われましたyahooオークションの出品者に聞かなければわからないのですか?

専門家に質問してみよう