1. 程式人生 > >雙網絡卡或多網絡卡情況下獲得所有的IP地址

雙網絡卡或多網絡卡情況下獲得所有的IP地址

在編寫基於sock的網路程式時,有時需列舉系統中繫結的所有IP地址,在一般控制元件無法解決些問題的情況下,可使用如下方法一試:

一、基於winsock的方法,例程如下(修改自網上一個名為“GetIP”的程式原始碼):

// GetIP.cpp : Defines the entry point for the console application.
// 修改:大漠 2005.12.26

#include "stdafx.h"
#include <stdio.h>
#include <winsock.h>
#include <windows.h>
#include <string.h>

void main()
{
 struct hostent *thishost;
 struct in_addr in;
 char MYName[80];
 char *Ptr;
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
    int i,n;  //迴圈變數

 wVersionRequested=MAKEWORD(2, 0);    //設定winsock版本
 err = WSAStartup(wVersionRequested, &wsaData);  //啟用winsock支援(增加winsock引用計數)
 if(err != 0)
 {
  exit(0);
 }
 gethostname(MYName, 80);    //取得主機名
 thishost = gethostbyname(MYName);    //取得主機的資訊(IP等)
 memset((void *)&in, sizeof(in), 0);
 
 //取得迴圈次數(IP地址數)
 n=strlen(*thishost->h_addr_list);
    n=n/2;

 for(i=0;i<n;i++)
 {
  in.s_addr = *((unsigned long *)thishost->h_addr_list[i]);
  Ptr = inet_ntoa(in);
        printf("IP地址%d:%s",i+1,Ptr);
 }

 WSACleanup();    //解除安裝winsock動態庫(減少引用計數)
}


二、使用“IP助手”

以下為引用自帖子:“VB 用WINSOCK 如何獲取多網絡卡的IP ”http://community.csdn.net/Expert/topic/4167/4167590.xml?temp=.3412592


介面上直接一個text1,記得設定可以換行
Option Explicit

' 偵測目前裝置上所使用的 IP 地址

' 設定在您的計算機上,最多可能使用 5 組 IP 地址,並且用來產生緩衝區
Private Const MAX_IP = 10

Private Type IPINFO
    dwAddr As Long              ' IP 地址
    dwNICIndex As Long          ' NIC 介面索引
    dwSubnetMask As Long        ' 子網掩碼
    dwBroadCastAddr As Long     ' 封包廣播地址
    dwReAssemblySize  As Long   ' 組譯大小
    unused1 As Integer          ' 暫不使用
    unused2 As Integer          ' 暫不使用
End Type

Private Type MIB_IPADDRTABLE
    dwEntrys As Long            ' 窗體中登入的數量
    arIPInfo(MAX_IP) As IPINFO  ' IP 地址登入陣列
End Type

Private Type IP_Array
    mBuffer As MIB_IPADDRTABLE  ' IP 地址清單陣列
    BufferLen As Long           ' 緩衝區長度
End Type

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetIpAddrTable Lib "IPHlpApi" (pIPAdrTable As Byte, pdwSize As Long, ByVal Sort As Long) As Long

' 將長整數轉換為字串
Public Function ConvertAddr2Str(LongAddress As Long) As String
    Dim addrByte(3) As Byte
    Dim Cnt As Long
    CopyMemory addrByte(0), LongAddress, 4
    For Cnt = 0 To 3
        ConvertAddr2Str = ConvertAddr2Str + CStr(addrByte(Cnt)) + "."
    Next Cnt
    ConvertAddr2Str = Left$(ConvertAddr2Str, Len(ConvertAddr2Str) - 1)
End Function

Private Sub Form_Load()
    Text1.Text = ""
    Me.Caption = "取得計算機上所使用的 IP 地址"
    Text1.Font.Size = 11
    Start
End Sub

Private Sub Form_Resize()
    Text1.Height = Me.Height - 38 * Screen.TwipsPerPixelY
    Text1.Width = Me.Width - 20 * Screen.TwipsPerPixelX
End Sub

Private Sub Start()
    Dim lRet As Long, I As Long
    Dim Buffer() As Byte
    Dim ListDatas As MIB_IPADDRTABLE

    Text1 = ""

    On Error GoTo Errors
    GetIpAddrTable ByVal 0&, lRet, True

    If lRet <= 0 Then Exit Sub
    ReDim Buffer(0 To lRet - 1) As Byte

    ' 取回 IP 地址的相關資料
    GetIpAddrTable Buffer(0), lRet, False

    Debug.Print Buffer(0)
    ' 利用已經安裝 IP 地址的前四個位元組,來取得登入的資訊
    CopyMemory ListDatas.dwEntrys, Buffer(0), 4
    Text1 = "在您的計算機上,共有 " & ListDatas.dwEntrys & " 組已經設定使用的 IP 地址" & vbCrLf
    Text1 = Text1 & String(45, "=") & vbCrLf
    For I = 0 To ListDatas.dwEntrys - 1

        ' 將存在記憶體之中的地址結構,複製到清單之中
        CopyMemory ListDatas.arIPInfo(I), Buffer(4 + (I * Len(ListDatas.arIPInfo(0)))), Len(ListDatas.arIPInfo(I))
        Text1 = Text1 & "IP 地址   :" & ConvertAddr2Str(ListDatas.arIPInfo(I).dwAddr) & vbCrLf
        Text1 = Text1 & "IP 子網掩碼:" & ConvertAddr2Str(ListDatas.arIPInfo(I).dwSubnetMask) & vbCrLf
        Text1 = Text1 & "IP 廣播地址 :" & ConvertAddr2Str(ListDatas.arIPInfo(I).dwBroadCastAddr) & vbCrLf
        Text1 = Text1 & String(45, "*") & vbCrLf & vbCrLf
    Next

Exit Sub

Errors:

End Sub

注:有關IP助手的使用方法請參見劉巍的文章:“IP Helper API 使用方法詳解”http://www.zdnet.com.cn/developer/code/story/0,2000081534,39046680,00.htm

相關推薦

情況獲得所有的IP地址

在編寫基於sock的網路程式時,有時需列舉系統中繫結的所有IP地址,在一般控制元件無法解決些問題的情況下,可使用如下方法一試:一、基於winsock的方法,例程如下(修改自網上一個名為“GetIP”的程式原始碼):// GetIP.cpp : Defines the entr

python爬蟲和營銷等場景更換本地IP地址的幾種辦法

log 批量操作 lan 去百度 body 小說 賬號 常用 註冊 想必大家在使用python爬蟲和在網絡營銷中註冊多個賬號等操作時,都遇到過IP限制的問題。這個IP不是小說動漫娛樂電影等IP,而是計算機的IP。道高一尺,魔高一丈。系統再怎麽牛也是程序員哥哥敲出來的。之前牛

oracle 更新欄位,更新非空欄位(null、‘’、一個個空格的情況

UPDATE LOA_FUND_HOLD_DTL    SET TRANS_STATUS = '2',    AND FAIL_INFO = NVL(TRIM(' ' from rec.FAIL_INFO),'主機對賬失敗。'),    A

C/C++ 獲得公網ip地址和內ip

bool getPublicIp(string& ip) { int sock; char **pptr = NULL; struct sockaddr_in destAddr; struct hostent *ptr = NULL; char

jspsmartupload元件實現單個個檔案上傳()

///實現新增多個附件 <%@ page language="java" pageEncoding="GBK"%> <html> <head>  <title>struts upload by zhangc</titl

基本數據類型在線程的情況是否需要加鎖

等於 access mes 程序 大於 bold data 結構 全局 對於多線程訪問同一變量是否需要加鎖的問題,先前大家都討論過。今天用代碼驗證了一下之前的猜想:32位CPU與內存的最小交換數據為4字節/次,這也是結構體要對齊4字節的原因。在物理上,CPU對於同一4字節的

scrapy 提取層巢狀標籤所有文字

怎樣才能一次性提取多層巢狀標籤的所有文字,詳細如下: 假如頁面如下: <p id='test'>hello<b>world!</b></p> 我要的提取結果是:world!(假設world是很多標籤組合的文字)

python3程序多種使用情況詳解

序言 最近在寫一個專案,需要使用到多程序。由於整個網路伺服器由自己開發,並沒有使用模組,所以在多程序上面越用越多的疑惑。經過一系列的測試,對整個python多程序有了更多的認識。 最大體會 每當使用multiprocessing建立新的程序,會複製主程序的所有狀態和引數。所以此時

Spring在執行緒的情況,如何控制事務起作用

因為執行緒不屬於spring託管,故執行緒不能夠預設使用spring的事務,也不能獲取spring注入的bean在被spring宣告式事務管理的方法內開啟多執行緒,多執行緒內的方法不被事務控制。如下程式碼,執行緒內呼叫insert方法,spring不會把insert方法加入事

Python+Selenium框架設計篇之6-一個類檔案個測試方法情況測試韌體的寫法

      其實,到前面這一篇文章,簡單的Python+Selenium自動化測試框架就已經算實現了。接下來的主要是介紹,unittest管理指令碼,如何如何載入執行指令碼,再就是採用第三方外掛,實現輸出html的測試報告。本文來介紹下,在同一個類中,多個測試函式時候,測試

java swing執行緒處理情況UI假死的解決

背景&問題專案中使用java swing做了個多執行緒處理任務的介面,在介面上顯示多執行緒任務的log資訊,為了實時顯示log資訊,使用了log4j的org.apache.log4j.WriterAppender並單獨開了執行緒。但是log資訊只在多執行緒任務結束後才

三層交換機上個VLAN的情況DHCP是如何讓指定VLAN獲得你分配給它的IP的?

這個東西可以實現而且不會出任何問題追究到底是交換機的DHCP 中繼(delay)搞定的客戶機發送的dhcp request資料包到達交換機的時候,因為交換機開啟了DHCP 中繼功能,所以在轉發的時候交換機會對這個request做點小手腳,他把這個客戶機所在vlan的閘道器(

DB2在表關聯的情況進行UPDATE的時候真有點BT!

t_sd_saleorderentry表有40多萬記錄,在DB2下看他的執行計劃為140000,且對t_sd_saleorderentry進行了全表掃描浪費了大部分的時間, 本以為DB2可以智慧的把()中的關聯條件轉化出來,在更新表資料的時候,可以智慧地更新相關的資料,但看

OpenStack節點搭建

1、新建三臺虛擬機器(controller、computer、object) 一、基礎環境配置 也可以建立一臺虛擬機器安裝好系統,其它兩臺進行拷貝,需做以下處理     1、修改網路 vim /etc/sysconfig/network-scrips/ifcfg-eth0 2、刪除 rm -rf

socket繫結INADDR_ANY,那會怎樣?(例如:通機房IP設定)

我也回覆一個!! 其中INADDR_ANY就是指定地址為0.0.0.0的地址,這個地址事實上表示不確定地址,或“所有地址”、“任意地址”。 一般情況下,如果你要建立網路伺服器,則你要通知伺服器作業系統:請在某地址 xxx.xxx.xxx.xxx上的某埠 yyyy上進行偵聽

管理之配置靜態ip綁定

線路 restart 完成 -1016 sla pts centos 技術 bond0 不知怎的,這幾天教室的網絡異常詭異,各種不穩定啊。原先小編都是通過自動獲取(dhcp)的方式來進行網絡連接的,現在這種網絡情況下需要(static)的方式來配置一個固定的ip。步驟如下:

進行綁定,不僅提高了寬帶的速率而且還讓其中一塊出現故障時,不會讓完全中斷

ont 多網卡 依然 支持 alt src 僅主機模式 查看 類型 一、在電腦中添加一塊網卡(我是用虛擬機做實驗所以下面的步驟在虛擬機上操作) 第三步驟點擊"僅主機模式(H)"原因是需要保證兩塊網絡的類型都是相同的 查看兩塊網卡的名稱: 配置網卡的參數 設置

【shell】海思3536 繫結聚合——bond技術

0.原理說明 目前網絡卡繫結mode共有七種(0~6)bond0、bond1、bond2、bond3、bond4、bond5、bond6 常用的有三種: mode=0:平衡負載模式,有自動備援,但需要”Switch”支援及設定。 mode=1:自動備援模式,其中一條線若斷線,其他線路

Eureka的自我保護模式、環境IP選擇和健康檢查

Eureka的自我保護模式 禁用自我保護模式: eureka.server.enable-self-preservation = false 多網絡卡環境下的IP選擇 對於多網絡卡的伺服器,各個微服務註冊到Eureka Server上的IP要如何指定呢? 指定IP在某些場合下

spring cloud EurekaClient ip 配置 和 原始碼分析

1、前言 對於spring cloud,各個服務例項需要註冊到Eureka註冊中心。 一般會配置ip註冊,即eureka.instance.prefer-ip-address=true。 但是,如果服務例項所在的環境存在多個網絡卡,經常會出現註冊過去的ip不是我們想要的ip。