• ベストアンサー

IPアドレスを抽出して出力するプログラム

下記のプログラムはIPアドレスを表示するプログラムです。for文を見てくれたら分かると思いますが、iが0~5まで繰り返し処理されるので、アドレスが5つ表示される結果になります。 このアドレスの先頭の数字(例えば「196.x.x.x」だと196)だけを見て先頭が196から始まるアドレスは表示して、先頭が196以外のアドレスは表示しないようにするにはどう書き加えればうまく実行できますか? OSはWinXPでコンパイラVC++です。 #include <stdio.h> #include <winsock2.h> #include <iphlpapi.h> int main() { DWORD i; PMIB_UDPTABLE pUdpTable; DWORD dwSize = 0; DWORD dwRetVal = 0; char *addr_ptr; if (GetUdpTable(NULL, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { pUdpTable = (MIB_UDPTABLE *) malloc (dwSize); } if ((dwRetVal = GetUdpTable(pUdpTable, &dwSize, 0)) == NO_ERROR) { if (pUdpTable->dwNumEntries > 0) { for (i=0; i<5; i++) { addr_ptr = (char *)&pUdpTable->table[i].dwLocalAddr; printf("Your Address: %s\n", inet_ntoa(*(struct in_addr *)addr_ptr)); } } } else { printf("GetUdpTable failed.\n"); LPVOID lpMsgBuf; if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //Default language (LPTSTR) &lpMsgBuf, 0, NULL )) { printf("\tError: %s", lpMsgBuf); } LocalFree( lpMsgBuf ); } return 0; }

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

  • ベストアンサー
回答No.1

 以下のようしては如何でしょう。 for (i=0; i<5; i++) { char buf[256]; addr_ptr = (char *)&pUdpTable->table[i].dwLocalAddr; sprintf(buf, "%s", inet_ntoa(*(struct in_addr *)addr_ptr)); if(strncmp(buf, "196", 3) == 0) printf("Your Address: %s\n", buf); }

noname#89227
質問者

お礼

 先頭が196から始まアドレスだけが表示できるようにうまく実行できました。 どうもありがとうございました。

その他の回答 (1)

  • joe-
  • ベストアンサー率34% (11/32)
回答No.2

if ((196 << 24) & pUdpTable->table[i].dwLocalAddr) とかはいかがでしょうか?

noname#89227
質問者

お礼

実行したら、警告のウィンドウが出てきました・・せっかく回答してもらったのにすみません・・・

関連するQ&A

専門家に質問してみよう