双网卡或多网卡情况下获得所有的IP地址_vb用winsock能获取多个网卡地址吗-程序员宅基地

技术标签: struct  string  byte  function  编程资料  buffer  integer  

在编写基于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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/paopaoc/article/details/562447

智能推荐

webUpload组件实现文件上传功能和下载功能_webuploader 0.1.5-程序员宅基地

文章浏览阅读392次。参考文章:http://blog.ncmem.com/wordpress/2023/09/14/webupload%e7%bb%84%e4%bb%b6%e5%ae%9e%e7%8e%b0%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e5%8a%9f%e8%83%bd%e5%92%8c%e4%b8%8b%e8%bd%bd%e5%8a%9f%e8%83%bd/systemConfig.properties文件。java后端downloadServlet代码。_webuploader 0.1.5

TSINGSEE青犀AI智能分析网关V4的人员摔倒检测算法及应用-程序员宅基地

文章浏览阅读782次,点赞18次,收藏9次。在安全监控领域,人员摔倒检测算法可以应用于工厂、工地等场所,实时监控工人的安全状况。一旦发生摔倒等意外事件,系统可以迅速发出警报,提醒管理人员及时采取救援措施,保障工人的生命安全。

c语言加密字符串正序变倒序,MD5加密(自能加密,不能解密)-程序员宅基地

文章浏览阅读462次。1.必须导入系统的头文件2.//MD5加密 为字符串加密-(void)md5{//1.需要加密的内容NSString str = @"我的iOS老师是最帅";//2.将数据转换为data类型 因为系统提供的md5加密的函数为C语言函数,所以需要将OC的字符串转换成C语言的字符串const char sourceData = [str UTF8String];//3.C语言的char类型的数组,..._md5_digest_length

java练习题-计算器_java程序模拟简单计算器定义名为number-程序员宅基地

文章浏览阅读309次。java练习题-计算器问题:编写Java程序模拟简单的计算器。定义名为Number的类其中有两个整型数据成员n1和n2应声明为私有。编写构造方法赋予n1和n2初始值再为该类定义加addition()、减substation()、乘multiplication()、除division()等公有实例方法分别对两个成员变量执行加、减、乘、除的运算。在main方法中创建Number类的对象调用各个方法并显示计算结果_java程序模拟简单计算器定义名为number

什么是超市LED显示屏-程序员宅基地

文章浏览阅读203次。在商场内,LED显示屏主要应用于投放商家提供的广告,如商铺展示、商品展示、餐饮食品展示、服饰展示、化妆品展示等。超市LED显示屏主要用于超市播放广告促销等信息,显示文字信息方面,主要包括室内LED显示屏、LED透明屏、LED圆柱屏以及户外大屏幕LED显示屏等类型。常见的商场led大屏都有哪些?以上就是小编为大家做的总结了,相信大家看了之后都有了一定的了解,如果有这方面的需求,可以直接咨询迈普光彩的技术人员,都会为大家一一解答的。超市主可使用LED显示屏发布一些日常宣传信息,如申请会员、折扣、打折等。

【CSS小例】赛博朋克-按钮动画-程序员宅基地

文章浏览阅读619次,点赞21次,收藏2次。纯CSS实现,赛博朋克故障风格动画效果

随便推点

LINUX配置ODBC环境连接达梦数据库常见错误_configure: error: in `/bigdata/apps/doris-master/t-程序员宅基地

文章浏览阅读2.7k次。1.执行./configure时报错checking for a BSD-compatible install... /usr/bin/install -cchecking whether build environment is sane... yeschecking for a thread-safe mkdir -p... /usr/bin/mkdir -pchecking for gawk... gawkchecking whether make sets $(MAKE)... yesc_configure: error: in `/bigdata/apps/doris-master/thirdparty/src/unixodbc-2.3

用Python绘制动态变化的曲线_python绘制动态曲线-程序员宅基地

文章浏览阅读1.1w次,点赞16次,收藏153次。无论从什么角度来说,圆锥曲线都非常适合动态演示,尤其是其中优美的几何关系,更能在动态变化中得到淋漓尽致的表现。_python绘制动态曲线

全国景区数据_全国旅游景点数据库-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏12次。全国景区数据汇总整理了全国31个省份及直辖市的1A-5A的景区信息,涵盖了景区名称、省份、景区级别、地址、经纬度、简介等字段,为相关研究助力! _全国旅游景点数据库

南大软院大神养成计划——第十天_大神计划数据-程序员宅基地

文章浏览阅读475次。今天是南大软院大神养成计划实施的第十天。今天主要学习了“DOM事件探秘”。首先说说第一章“事件流”,那什么是事件流呢?事件流就是描述描述从页面中接受事件的顺序,在浏览器中,IE和Netscape提出了相反的慨念,IE提出的是事件冒泡流,就是我们现在常用的事件流,Netscape提出的事件捕获流。首先说说事件冒泡流,事件冒泡流就是即事件最开始由最具体的无素(文档中嵌套层次最深的那个节点)接收,然_大神计划数据

端口被占用,但netstat却查询不到_linux 端口可以telnet通但是netstat -npl看不到-程序员宅基地

文章浏览阅读5.5k次。偶然遇到一个情况,A服务器和B服务器。A服务器能够Telnet B 8020端口,但B服务器通过netstat命令却查询不到8020端口。其原因是:Docker 所占用的端口,没有通过netstat查出来。(这里为什么没查出来,还不知道)。A服务器Telnet B,能够ConectionB服务器,netstat未查询到端口占用使用docker命令查询映射端口情况,发现8020端口..._linux 端口可以telnet通但是netstat -npl看不到

基于JavaWeb的在线音乐系统_web音乐播放器数据流图-程序员宅基地

文章浏览阅读1.6w次,点赞7次,收藏107次。开发环境:Jdk7(8)+Tomcat7(8)+Mysql+IntelliJ IDEA(Eclipse)数据库:MySQL技术:Java+Servlet+Jquery+JavaScript+Ajax+JSP+Bootstrap适用于:课程设计,毕业设计,学习等等系统介绍:本系统是采用Java Web技术的B-S架构的网站,用到的技术有Java EE 、CSS、JavaScript、Ajax。为了使用的效果以及开发的简便,在前端使用了CSS的Bootstrap及其UI组件框架,JS的Jque_web音乐播放器数据流图

推荐文章

热门文章

相关标签