|
|
Winsock Programmer's FAQ |
|
|
このサンプルでは、自分のマシンのIPアドレスを取得する方法を示 しています。はい、ここでの「IPアドレス」は複数形です。本来全ての TCP/IP マシンは少なくとも二つのIPアドレスを持っています。すなわ ち、ループバックインターフェース(127.0.0.1)と、一つ以上の「普通 の」ネットワークインターフェースです。ループバックインターフェー スによって、同一のマシン上で二つのプログラムが、ハードウェアドラ イバを経由せずにお互いにお話できるようになります。 それに加えて、多くのマシンでは一つ以上の「普通の」ネットワー クインターフェースを持っています。例えば私の自宅のマシンでは、イー サネットのネットワークボードにIPアドレスが一個と、ISPに接続した ときのモデム用に一個持っています。
もしこれらのインタフェースの中からインテリジェントに一個選ぶ ようにプログラムしたいと思ったら、自力でがんばってください。たい ていは、結局ユーザに一個選ばせることになっちゃうと思うんだけどね。 getlocalip.cpp
// Borland C++ 5.0: bcc32.cpp getlocalip.cpp
// Visual C++ 5.0: cl getlocalip.cpp wsock32.lib
#include <iostream.h>
#include <winsock.h>
int doit(int, char **)
{
char ac[80];
if (gethostname(ac, sizeof(ac)) == SOCKET_ERROR) {
cerr << "Error " << WSAGetLastError() <<
" when getting local host name." << endl;
return 1;
}
cout << "Host name is " << ac << "." << endl;
struct hostent *phe = gethostbyname(ac);
if (phe == 0) {
cerr << "Yow! Bad host lookup." << endl;
return 1;
}
for (int i = 0; phe->h_addr_list[i] != 0; ++i) {
struct in_addr addr;
memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
cout << "Address " << i << ": " << inet_ntoa(addr) << endl;
}
return 0;
}
int main(int argc, char *argv[])
{
WSAData wsaData;
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
return 255;
}
int retval = doit(argc, argv);
WSACleanup();
return retval;
}
|
| << Passing Sockets Between Processes | インターフェースのリストを取得する方法 >> |
| Last modified: $Id: ipaddr.html,v 1.4 2002/11/09 20:40:33 ksk Exp $ | Go to the original FAQ page |
| < Go to the main FAQ page | << Go to the Home Page |