socket获取本机IP地址方法

    获取计算机的名称和IP地址可以通过调用winsock里面的函数完成,下面上是用到的函数:1.WSAStartup(),此函数在应用程序中初始化windows sockets DLL,这个函数调用成功后,才可以调用其他的api函数。

2.WSACleanup()函数,应用程序会占用系统资源,这个函数用来解除与socket的绑定,并且释放占用的系统资源。

3.gethostname() 用于获取本地主机的主机名

4.gethostbyname()gethostname()获取的主机名可以传入gethostbyname,获取“主机列表”。一台主机可以有多个IP地址,为了输出所有IP地址,要用一个循环来实现。

#include <iostream>
using namespace std;
#include "winsock2.h"
#pragma comment(lib,"ws2_32.lib")
int main()
{
WSAData data;
if(WSAStartup(MAKEWORD(1,1),&data)!=0)
{
   cout<<"初始化错误endl ;
}
  
char host[255];
if(gethostname(host,sizeof(host))==SOCKET_ERROR)
{
   cout<<"无法获取主机名"<<endl;
}
else
{
   cout<<"本机计算机名为:"<<host<<endl;
}

struct hostent *p=gethostbyname(host);
if(p==0)
{
   cout<<"无法获取计算机主机名及IP"<<endl;
}
else
{
     
   //本机IP:利用循环,输出本机所有IP
   for(int i=0;p->h_addr_list[i]!=0;i++)
   {
    struct in_addr in;
    memcpy(&in,p->h_addr_list[i],sizeof(struct in_addr));
    cout<<"第"<<i+1<<"块网卡的IP为:"<<inet_ntoa(in)<<endl;
   }

}

WSACleanup();

cin.get();
return 0;
}


上面的代码中,gethostbyname的返回值送入了hostent结构体中,hostent结构体在winsock2.h中声明

 hostent的定义如下:

struct hostent{

char *h_name;

char **h_aliases;

int h_addrtype;

int h_length;

char **h_addr_list;

# define h_addr h_addr_list[0];

};

h_name   为地址名称

h_aliases 地址的预备名称指针

h_addtype  地址类型

h_length   地址的长度

h_addr_list  主机网络地址指针

h_addr   h_add_list 的第一个地址


你可能感兴趣的:(C++,socket,tcpip)