使用WSAIoctl和SIO_ADDRESS_LIST_QUERY去查询本机ip



#include <winsock2.h>

#pragma comment(lib, "WS2_32")	// 链接到WS2_32.lib

#include <Ws2tcpip.h>

#include <stdio.h>

#include <windows.h>

#include <Mswsock.h>

int main()

{

	int wsError = 0;

	DWORD bytesReturned = 0;

	char* pAddrString;

	SOCKADDR_IN* pAddrInet;

	u_long SetFlags = 0;

	struct   sockaddr_in sock_sniff;

	WSADATA       wsd;

	if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)

    {

        printf("WSAStartup() failed: %d/n", GetLastError());

        return -1;

    }

	USHORT nPort = 4567;	// 此服务器监听的端口号



	// 创建监听套节字

	SOCKET s;

	if((s = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)

	{

		fprintf (stderr, "Socket creation failed/n");

		WSACleanup();

     	return false;

  	}

	sock_sniff.sin_family = AF_INET;

	sock_sniff.sin_port = htons(4444);

	sock_sniff.sin_addr.s_addr = INADDR_ANY;

	if ( bind( s, (struct sockaddr *)&sock_sniff, sizeof(sock_sniff) ) == SOCKET_ERROR )

	{

        printf( "Error: bind = %ld/n", WSAGetLastError() );

		closesocket(s);

		exit(-2);

	}

	

  

	SOCKET_ADDRESS_LIST *slist=NULL;

    char                 buf[2048];

    DWORD                dwBytesRet;

    int                  ret;



	fprintf(stderr, "Scanning Interfaces . . ./n/n");

    ret = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, buf, 2048,&dwBytesRet, NULL, NULL);

	slist = (SOCKET_ADDRESS_LIST *)buf;

    int num = slist->iAddressCount;

	if(num > 0)

	{

		pAddrInet = ((SOCKADDR_IN*)slist->Address[num-1].lpSockaddr);

			pAddrString = inet_ntoa(pAddrInet->sin_addr);

			

		printf("IP:%s/r/n/n",pAddrString);

	}

	else

	{

           printf("网卡没有连接!/r/n/n");

	}



    return true;

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值