C++获取本机的IP地址。如何实现????

我需要获取本机的IP地址存为string。代码怎么写?来人写几句代码。... 我需要获取本机的IP地址存为string。代码怎么写?来人写几句代码。 展开
 我来答
宿啥品8397
2015-03-10 · TA获得超过4528个赞
知道大有可为答主
回答量:3273
采纳率:60%
帮助的人:1785万
展开全部
#include<WinSock2.h>
#pragma comment(lib,"WS2_32")
class CInitSock
{
public:
    CInitSock(BYTE minorVer=2,BYTE majorVer=2)
    {
        WSADATA wsaData;
        WORD sockVersion=MAKEWORD(minorVer,majorVer);
        if(WSAStartup(sockVersion,&wsaData)!=0)
        {
            exit(0);
        }
    }
    ~CInitSock()
    {
        WSACleanup();
    }
};


WSADATA   这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets 数据。它包含Winsock.dll 执行的数据。

WSAStartup    为了在应用程序当 中调用任何一个Winsock API函数,首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。使用 Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明 副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的 Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。

WSACleanup   应用程序或DLL在使用Windows Sockets服务之前必须要进行一次成功的WSAStartup()调 用.当它完成了Windows Sockets的使用后,应用程序或DLL必须调用WSACleanup()将其从Windows Sockets的实现中注销,并且该实现释放为应用程序或DLL分配的任何资源.任何打开的并已建立连接的SOCK_STREAM类型套接口在调用 WSACleanup()时会重置; 而已经由closesocket()关闭却仍有要发送的悬而未决数据的套接口则不会受影响- 该数据仍要发送.   对应于一个任务进行的每一次WSAStartup()调用,必须有一个 WSACleanup()调用.只有最后的WSACleanup()做实际的清除工作;前面的调用仅仅将Windows Sockets DLL中的内置引用计数递减.一个简单的应用程序为确保WSACleanup()调用了足够的次数,可以在一个循环中不断调用WSACleanup()直 至返回WSANOTINITIALISED.





#include"initsock.h"
#include<iostream>
using std::cout;
using std::endl;

CInitSock initSock;
void IP()
{
    int i;
    char szHost[256];
    gethostname(szHost,256);
    hostent *pHost=gethostbyname(szHost);
    in_addr addr;
   
    char *p=pHost->h_addr_list[0];
    memcpy(&addr.S_un.S_addr,p,pHost->h_length);
    char *szIp=inet_ntoa(addr);
    cout<<szIp<<endl;
}

int main()
{
    IP();
    system("pause");
    return 0;
}


gethostname()   返回本地主机的标准主机名。
int PASCAL FAR gethostname(char FAR *name, int namelen);   
name: 一个指向将要存放主机名的缓冲区指针。   
namelen:缓冲区的长度。

hostent      是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。之所以主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,自然有多个地址。

#define h_addr h_addr_list[0]    h_addr_list中的第一地址。

struct hostent {   
     char *h_name;       //地址的正式名称 
     char **h_aliases;   //空字节-地址的预备名称的指针。
     int h_addrtype;   //地址类型; 通常是AF_INET。
     int h_length;       //地址的比特长度。
     char **h_addr_list;     //零字节-主机网络地址指针。网络字节顺序。
};

memcpy
extern void *memcpy(void *destin, void *source, unsigned n);
由source指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。
Storm代理
2023-07-25 广告
StormProxies是一家国内优质海外HTTP代理商,拥有一个庞大的IP资源池,覆盖200多个地区,IP数量大且匿名度高。其优点还包括超高并发、稳定高效、技术服务等特点,同时提供HTTP、HTTPS以及SOCKS5协议支持。此外,Sto... 点击进入详情页
本回答由Storm代理提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式