//○RAWソケットで、アドレス(NIC)の列挙
//Win2000以上でしか動作しません

#pragma comment(lib, "ws2_32.lib")

#include <stdio.h>
#include <winsock2.h>

int main(){
	WSADATA wsaData;
	if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0) return false;

	SOCKET s;
	s = WSASocket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
	if(s==INVALID_SOCKET) return false;

	DWORD d;
	char listPos[5000];

	if(SOCKET_ERROR==WSAIoctl(s,SIO_ADDRESS_LIST_QUERY,NULL,0,listPos,sizeof(listPos),&d,NULL,NULL)){
		return false;
	}
	SOCKET_ADDRESS_LIST*list=(SOCKET_ADDRESS_LIST*)listPos;

	for(int i=0;i<list->iAddressCount;i++){
		printf("%d : %s\n",i,inet_ntoa(((SOCKADDR_IN*)list->Address[i].lpSockaddr)->sin_addr));
	}

	closesocket(s);
	WSACleanup();
	return 0;
}




▲トップページ > Windows と C++