1. 程式人生 > >獲得本機ipv4和ipv6地址(即有線網絡卡地址)

獲得本機ipv4和ipv6地址(即有線網絡卡地址)

程式原始碼如下:

1. 形參ipv4, ipv6為外部呼叫者傳入,用來儲存ipv4地址和ipv6地址,

2. MAX_PATH為自定義巨集, 為數值260, IPVN_SIZE為數值50, DEFAULT_STR_PORT為字串"8080"

3. 需在標頭檔案中包含以下內容

#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib,"Ws2_32.lib")

void CAllBox::getLocalIPv4( char * ip4)
{
	// 獲得本機主機名
#ifdef _WIN32
	INT rc;
	WSADATA wsaData;

	rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (rc) {
		return ;
	}
#endif

	char hostname[MAX_PATH];
	memset(hostname, 0, MAX_PATH);
	gethostname(hostname, MAX_PATH);
	struct hostent FAR* lpHostEnt = gethostbyname(hostname);
	if (lpHostEnt == NULL)
	{
		return;
	}

	// 取得IP地址列表中的第一個為返回的IP, 即有線網絡卡IP(因為一臺主機可能會繫結多個IP)
	LPSTR lpAddr = lpHostEnt->h_addr_list[0];

	// 將IP地址轉化成字串形式
	struct in_addr inAddr;
	memmove(&inAddr, lpAddr, 4);

#ifdef _WIN32
	WSACleanup();
#endif

	strncpy(ip4, inet_ntoa(inAddr), strlen(inet_ntoa(inAddr)));

	return;
}

void CAllBox::getLocalIPv6(char* ip6)
{
#ifdef _WIN32
	INT rc;
	WSADATA wsaData;

	rc = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (rc) {
		return ;
	}
#endif

	PHOSTENT hostinfo;
	char hostname[HOSTNAME_LEN];      //主機名  
	char *port = DEFAULT_STR_PORT;			//埠號
	int ilRc;
     memset(hostname, 0, HOSTNAME_LEN);
	gethostname(hostname, sizeof(hostname));

	struct addrinfo hint;
	struct addrinfo *ailist = NULL, *aip = NULL;
	struct sockaddr_in6 *sinp6;

	hint.ai_family = AF_INET6;          /*  hint 的限定設定  */
	hint.ai_socktype = SOCK_STREAM;     /*   這裡可是設定 socket type    比如  SOCK——DGRAM */
	hint.ai_flags = AI_PASSIVE;         // flags 的標誌很多  。常用的有AI_CANONNAME;
	hint.ai_protocol = DEFAULT_PROT;               /*  設定協議  一般為0,預設 */
	hint.ai_addrlen = DEFAULT_ADDRLEN;                /*  下面不可以設定,為0,或者為NULL  */
	hint.ai_canonname = NULL;
	hint.ai_addr = NULL;
	hint.ai_next = NULL;
	ilRc = getaddrinfo(hostname, port, &hint, &ailist);    /*通過主機名獲得地址資訊*/
	if (ilRc < 0)
	{
		char str_error[ERR_MSG_LEN];
		strcpy(str_error, (char *)gai_strerror(errno));
		return ;
	}
	if (ailist == NULL)
	{
		return ;
	}

	aip = ailist;
	aip->ai_family == AF_INET6;
	sinp6 = (struct sockaddr_in6 *)aip->ai_addr;     
	inet_ntop(AF_INET6, (void*)&sinp6->sin6_addr, ip6, IPVN_SIZE);

#ifdef _WIN32
	WSACleanup();
#endif

	return ;
}


相關推薦

獲得ipv4ipv6地址有線地址

程式原始碼如下: 1. 形參ipv4, ipv6為外部呼叫者傳入,用來儲存ipv4地址和ipv6地址, 2. MAX_PATH為自定義巨集, 為數值260, IPVN_SIZE為數值50, DEFAULT_STR_PORT為字串"8080" 3. 需在標頭檔案中包含以下內容

shell 獲得IPfree埠

#!/bin/bash IPaddr=`ifconfig | grep inet\\\\s | grep -v "127.0.0." | sed "s/addr://g"| awk '{print $2}'` function getfreeport() { IPa

vc獲取mac地址無線有線

獲取網絡卡的MAC地址的方法很多,如:Netbios,SNMP,GetAdaptersInfo等。經過測試發現 Netbios 方法在網線拔出的情況下獲取不到MAC,而 SNMP 方法有時會獲取多個重複的網絡卡的MAC,試來試去還是 GetAdaptersInfo 方法比較

Linux修改地址臨時/永久

1.臨時修改(重啟服務或者重啟系統後失效): ifconfig eth0 192.168.1.1 netmask 255.255.255.0 縮略:ifconfig eth0 192.168.1.1 (eth0是第一個網絡卡,eth1是第二個)   2  永久修改

從ip addr addifconfig的區別看linuxip地址的結構

                今天一個老外在郵件列表上問了一個問題,就是ip addr add和ifconfig的區別,我給他進行了解答,可能因為英語不好吧,解答的很簡單,因此我還是要在這裡詳細說明一下。其實它們之間沒有什麼區別,只 是表述方式不同罷了。如果你非常理解網路協議的原理以及網路的分層架構那麼我想

【查蟲日誌】快速判斷一副灰度影象中是否只有黑色白色值是否為二值影象過程中bool變數的是是非非。

  二值影象我們在影象處理過程中是經常遇到的,有的時候我們在進行一個演算法處理前,需要判斷下一副影象的資料是否符合二值圖的需求,這個時候我們可以寫個簡單的函式來做個判斷,比如我寫了一個很簡單的的程式碼如下: bool IM_IsBinaryImage_C(unsigned char *Src, int

hihocode 1584 : Bounce 找規律2017 北京賽G

hihocode sin scanf 容易 pac pre ace clas esp 題目鏈接 比賽時隨便找了個規律,然後隊友過了。不過那個規律具體細節還挺煩的。剛剛偶然看到Q巨在群裏提到的他的一個思路,妙啊,很好理解,而且公式寫起來也容易。OrzQ巨 #includ

Android裝置支援USB轉RJ45有線 沐陽JP1081B/9700

Android裝置支援USB轉RJ45有線網絡卡( 沐陽網絡卡JP1081B9700) 網絡卡裝置: 沐陽網絡卡JP1081B/9700 系統平臺: HISI3798MV100  Android : 4.2 1、分析網絡卡驅動在ubuntu系統上通過lsusb命令檢視網絡卡的驅動資訊

Android5.1系統啟動過程中啟動有線併為其分配靜態IP地址

Android5.1系統啟動過程中啟動有線網絡卡併為其分配靜態IP地址 遇到這個問題的時候剛開始自己以為在init.rc中新增兩行命令就能解決問題,可是後來發現並非如此簡單,所以用下面的文字記錄一下自己解決這個問題的方法。 首先想到的方法是在init.rc中用ifup eth0命令將埠啟動起

Linux軟體安裝及VirtualBox地址10.0.2.15ip問題

在VirtualBox中安裝linux(centOS-6-bin-DVD1) 發現ip是10.0.2.15 在用客戶端連線22埠一直不能連線 出現這種情況,是因為VirtualBox的預設網路連線方式為這個:  將它改為【橋接網絡卡】: Linux解壓縮命令

dynamips中引數如何網路連線中的具體匹配

使用dynamips可以搭建虛擬的網路環境,所以很多人都知道,但是有一個小疑惑,相信很多人都有,就是如何根據網絡卡引數匹配具體的網絡卡連線,比如我的機器上的網絡卡引數如下: 那麼我們如何根據這些網絡卡引數來找到對應的網路連線呢? 我本機的網路連線如下: 大家仔細觀察,可以發現

配置無線有線分別上內外的方法

場景: 到機房去部署應用,需要內網才可以連線到伺服器,部署的同時可能經常需要查資料,也就需要連線外網,然而同時使用wifi和有線的時候,要麼都走wifi,要麼都走有線,導致內外網不能同時訪問,要一直切換,非常麻煩。 解決方案: 利用route配置路由,然後XXX.XXX.

C#讀取地址的幾種方法

 轉自:http://www.cnblogs.com/diulela/archive/2012/04/07/2436111.html  以下是收集的幾種C#程式讀取MAC地址的方法,示例中是讀取所有網絡卡的MAC地址,如果僅需要讀取其中一個,稍作修改即可。 1 通過IPCo

cirros 修改地址

cat /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 172.16.0.254 netmask

Win7 + CentOS7 雙系統----博通無線幸運兒

        本來我機子上是Ubantu和Win7的雙系統,用著EasyBCD做的Win7引導Ubantu(雖然Ubantu自帶引導win7,但是本人強迫症,要不然也不會在好好地情況下又裝Centos了~~QAQ,):       1.由於本人之前裝Ubantu是用的U盤

u-boot 新增設定地址的命令

#if defined(CONFIG_CMD_PING) static int do_ping(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { if (argc < 2) return -1; NetPingIP = string

資料包接收系列 — 上半部實現驅動

本文主要內容:網路資料包接收的上半部實現,主要分析網絡卡驅動相關部分。 核心版本:2.6.37 Author:zhangskd @ csdn blog 網絡卡概述 (1) 網絡卡收包 網線上的物理幀首先被網絡卡晶片獲取,網絡卡晶片會檢查物理幀的CRC,保證完整性。 然後

C# 區分無線有線的MAC

C# 獲取MAC地址 方法一: 使用 ManagementClass string strMAC = ""; ManagementClass MC = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjec

全雙工半雙工模式在中的區別以及修改速率

在全雙工模式下,8根線都要分別接到水晶頭相應的線序位置上; 在半雙工模式下,只需接4根線,參照T568B標準,一般使用1 、2、3、6 線序位置上的四根線,即:白橙、橙、白綠、綠 四根線; 白橙、橙 用於傳送資料 ,白綠、綠 用於接收資料。     全雙工模式下,網線最大可

筆記本有線未識別無法獲取IP地址

一直以來都是使用WIFI連線路由器上網,今天閒著沒事幹找了根網線連線到路由器,發現無法上網,顯示未識別網路. 1,用另外一臺筆記本嘗試一切正常,初步排除路由器和網線出現問題. 2,解除安裝有線網絡卡驅動,重啟,安裝網絡卡驅動,重啟,問題一樣存在,排除驅動問題. 3,開啟路由