主流操作系统中给网卡添加内存IP
来源:互联网 发布:qt 编程视频教程 编辑:程序博客网 时间:2024/04/30 10:52
因为有些时候项目需要,几大主流操作系统如下:
注:此方法是存在内存中的虚拟IP地址,即非静态,表示重启会丢失。对于静态IP,WINDOWS请参考netsh,Linux请参考setup等设置,AIX请参考smit mktcpip,本文不做讨论,比较简单。
由于WINDOWS没有直接提供内存IP的添加方法,找到API接口我从C++翻译过来的,由于学过一些汇编比较熟一点。下面是源码
include masm32rt.inc include Iphlpapi.inc includelib Iphlpapi.lib include ws2_32.inc includelib ws2_32.lib include masm32.inc includelib masm32.lib include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include windows.inc include c:\radasm\masm32\macros\macros.asm;===================================================================================printf MACRO format:REQ, args:VARARG IFNB <args> invoke crt_printf, cfm$(format), args ELSE invoke crt_printf, cfm$(format) ENDIF EXITM <>ENDM;=================================================================================== typedef struct { char String[4 * 4];} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING; typedef struct _IP_ADDR_STRING { struct _IP_ADDR_STRING* Next; IP_ADDRESS_STRING IpAddress; IP_MASK_STRING IpMask; DWORD Context;} IP_ADDR_STRING, *PIP_ADDR_STRING;typedef struct _IP_ADAPTER_INFO { struct _IP_ADAPTER_INFO *Next; DWORD ComboIndex; char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]; char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]; UINT AddressLength; BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; DWORD Index; UINT Type; UINT DhcpEnabled; PIP_ADDR_STRING CurrentIpAddress; IP_ADDR_STRING IpAddressList; IP_ADDR_STRING GatewayList; IP_ADDR_STRING DhcpServer; BOOL HaveWins; IP_ADDR_STRING PrimaryWinsServer; IP_ADDR_STRING SecondaryWinsServer; time_t LeaseObtained; time_t LeaseExpires;} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;|IP_ADDRESS_STRING STRUCT String BYTE 16 dup(?)IP_ADDRESS_STRING ENDSIP_MASK_STRING TYPEDEF IP_ADDRESS_STRINGIP_ADDR_STRING STRUCT Next DWORD ? IpAddress IP_ADDRESS_STRING <> IpMask IP_MASK_STRING <> Context DWORD ?IP_ADDR_STRING ENDSPIP_ADDR_STRING TYPEDEF PTR IP_ADDR_STRINGMAX_ADAPTER_DESCRIPTION_LENGTH equ 128MAX_ADAPTER_NAME_LENGTH equ 256MAX_ADAPTER_ADDRESS_LENGTH equ 8IP_ADAPTER_INFO STRUCT Next DWORD ? ComboIndex DWORD ? AdapterName BYTE MAX_ADAPTER_NAME_LENGTH + 4 dup(?) Description BYTE MAX_ADAPTER_DESCRIPTION_LENGTH + 4 dup(?) AddressLength DWORD ? Address BYTE MAX_ADAPTER_ADDRESS_LENGTH dup(?) Index DWORD ? _Type DWORD ? DhcpEnabled DWORD ? CurrentIpAddress PIP_ADDR_STRING ? IpAddressList IP_ADDR_STRING <> GatewayList IP_ADDR_STRING <> DhcpServer IP_ADDR_STRING <> HaveWins BOOL ? PrimaryWinsServer IP_ADDR_STRING <> SecondaryWinsServer IP_ADDR_STRING <> LeaseObtained DWORD ? LeaseExpires DWORD ?IP_ADAPTER_INFO ENDSMIB_IF_TYPE_OTHER equ 1MIB_IF_TYPE_ETHERNET equ 6MIB_IF_TYPE_TOKENRING equ 9MIB_IF_TYPE_FDDI equ 15MIB_IF_TYPE_PPP equ 23MIB_IF_TYPE_LOOPBACK equ 24MIB_IF_TYPE_SLIP equ 28 CTXT MACRO quoted_text:VARARG EXITM <offset literal(quoted_text)> ENDM;=================================================================================== MAKELANGID MACRO p,s mov eax, ((((WORD )(s)) << 10) | (WORD )(p)) exitm <eax> endm .const c_ParamNum equ 5 .data outBufLen dd SIZEOF IP_ADAPTER_INFO d_prarmeter dd ? d_ip UINT ? d_mask UINT ? sz_temp db ? ifIndex dd 0 NTEContext dd 0 NTEInstace dd 0 lpMsgBuf LPVOID ? dwRetVal DWORD 0 g_dwParamArray dd c_ParamNum+1 dup(0);存放各命令行参数首地址 g_szCmdLine db 256 dup (?);存放命令行参数 sz_command db 3 dup(?) sz_ip db 15 dup(?) sz_mask db 15 dup(?) sz_delip_command db "interface",10,13, "ip",10,13, "add address ",0 .codeGetCmdParam proc lpszCmdLine: LPSTR, lpdwParam: dword local dwFlag: dword local dwParamCount: dword invoke GetCommandLine ;取命令行 invoke lstrcpy, lpszCmdLine, eax mov eax, lpszCmdLine mov esi, eax mov edi, lpdwParam mov dword ptr [edi], eax ;save param 0 add edi, 4 mov dwFlag, 1 mov dwParamCount, 1@GetCmdParamNext: inc esi movzx eax, byte ptr [esi] cmp eax, 0 je @GetCmdParamRet cmp eax, ' ' ;skip Space jne @F cmp dwFlag, 0 je @GetCmdParamNext jne @GetCmdParamEnd@@: cmp eax, 9 ;skip Tab jne @F cmp dwFlag, 0 jne @GetCmdParamEnd je @GetCmdParamNext@@: cmp eax, '/' jne @F cmp dwFlag, '"' je @GetCmdParamNext jne @GetCmdParamSave@@: cmp eax, '"' jne @F cmp dwFlag, 0 je @GetCmdParamSave inc esi mov dwFlag, 1 jmp @GetCmdParamEnd@@: cmp dwFlag, 0 jne @GetCmdParamNext@GetCmdParamSave: inc dwParamCount cmp dwParamCount, c_ParamNum jg @GetCmdParamRet mov dwFlag, eax mov dword ptr [edi], esi add edi, 4 jmp @GetCmdParamNext@GetCmdParamEnd: cmp dwFlag, '"' je @GetCmdParamNext mov dwFlag, 0 mov byte ptr [esi], 0 jmp @GetCmdParamNext@GetCmdParamRet: retGetCmdParam endp ;===================================================================================start: ;=================================================================================== ;printf("SIZEOF IP_ADAPTER_INFO: %d\n\n", outBufLen) mov ebx, alloc(outBufLen) .IF ebx == 0 printf("内存分配错误\n") inkey "Press any key to exit..." exit 1 .ENDIF invoke GetAdaptersInfo, ebx, ADDR outBufLen .IF eax == ERROR_BUFFER_OVERFLOW free ebx mov ebx, alloc(outBufLen) .IF ebx == 0 printf("内存分配错误\n") inkey "Press any key to exit..." exit 1 .ENDIF .ENDIF invoke GetAdaptersInfo, ebx, ADDR outBufLen .IF eax == NO_ERROR mov esi, ebx .WHILE esi printf("\t\n序号: \t%d\n", [esi].IP_ADAPTER_INFO.ComboIndex) ;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{3EB7347E-D1B8-4015-BEB1-CE35E7E0A042}\Connection mov eax, OFFSET IP_ADAPTER_INFO.AdapterName add eax, esi printf("名称: \t%s\n", eax) mov eax, OFFSET IP_ADAPTER_INFO.Description add eax, esi printf("描述: \t%s\n", eax) printf("地址: \t") mov edi, 1 .WHILE edi < [esi].IP_ADAPTER_INFO.AddressLength movzx eax, BYTE PTR [esi+edi-1].IP_ADAPTER_INFO.Address printf("%.2X-", eax) inc edi .ENDW movzx eax, BYTE PTR [esi+edi-1].IP_ADAPTER_INFO.Address printf("%.2X\n", eax) printf("\tIndex: \t%d\n", [esi].IP_ADAPTER_INFO.Index) printf( "\tType: \t") SWITCH [esi].IP_ADAPTER_INFO._Type CASE MIB_IF_TYPE_OTHER printf("Other\n") CASE MIB_IF_TYPE_ETHERNET printf("Ethernet\n") CASE MIB_IF_TYPE_TOKENRING printf("Token Ring\n") CASE MIB_IF_TYPE_FDDI printf("FDDI\n") CASE MIB_IF_TYPE_PPP printf("PPP\n") CASE MIB_IF_TYPE_LOOPBACK printf("Lookback\n") CASE MIB_IF_TYPE_SLIP printf("Slip\n") DEFAULT printf("Unknown type %d\n", [esi].IP_ADAPTER_INFO._Type) ENDSW mov eax, OFFSET IP_ADAPTER_INFO.IpAddressList.IpAddress.String add eax, esi printf("\tIP 地址: \t%s\n", eax); mov eax, IP_ADAPTER_INFO.IpAddressList.Next; mov eax,OFFSET IP_ADAPTER_INFO.IpAddressList.IpAddress[48]; add eax, esi; printf("\tIP 地址: \t%s\n", eax) mov eax, OFFSET IP_ADAPTER_INFO.IpAddressList.IpMask.String add eax, esi printf("\t子网掩码: \t%s\n", eax) mov eax, OFFSET IP_ADAPTER_INFO.GatewayList.IpAddress.String add eax, esi printf("\t网关: \t%s\n", eax) printf("\t***\n") .IF [esi].IP_ADAPTER_INFO.DhcpEnabled printf("\tDHCP Enabled: Yes\n") mov eax, OFFSET IP_ADAPTER_INFO.DhcpServer.IpAddress.String add eax, esi printf("\t DHCP Server: \t%s\n", eax) .ELSE printf("\tDHCP Enabled: No\n") .ENDIF .IF [esi].IP_ADAPTER_INFO.HaveWins printf("\tHave Wins: Yes\n") mov eax, OFFSET IP_ADAPTER_INFO.PrimaryWinsServer.IpAddress.String add eax, esi printf("\t Primary Wins Server: %s\n", eax) mov eax, OFFSET IP_ADAPTER_INFO.SecondaryWinsServer.IpAddress.String add eax, esi printf("\t Secondary Wins Server: %s\n", eax) .ELSE printf("\tHave Wins: No\n") .ENDIF printf("\n") mov esi, [esi].IP_ADAPTER_INFO.Next .ENDW .ELSE printf("失败: %d\n", eax) inkey "Press any key to exit..." exit 1 .ENDIF free ebx invoke GetCmdParam, addr g_szCmdLine, addr g_dwParamArray mov edi, offset g_dwParamArray add edi, 4 push edi invoke lstrcpy ,offset sz_command,[edi] pop edi add edi, 4 push edi invoke lstrcpy ,offset ifIndex,[edi] pop edi add edi, 4 push edi invoke lstrcpy ,offset sz_ip,[edi] pop edi add edi,4invoke lstrcpy ,offset sz_mask,[edi] mov eax, offset sz_ip invoke inet_addr,eax .if eax==INADDR_NONE printf("IP Adress不是一个有效的值 %d\n", eax) .endif mov d_ip,eax mov eax, offset sz_mask invoke inet_addr,eax .if eax==INADDR_NONE printf("MASK不是一个有效的值 %d\n", eax) .endif mov d_mask,eax invoke AddIPAddress, d_ip, d_mask,uval(offset ifIndex),offset NTEContext,offset NTEInstace .if eax==NO_ERROR printf("IPv4 address successfully added.\n") .else printf("IPv4 address add failure.\n") .endif printf("\t\n-------------------------------------------\t\n") printf("ifcfg add index 192.168.1.2 255.255.255.0") exit 0 end start
添加:
ifcfg add index 192.168.1.2 255.255.255.0
删除:
ifcfg del 192.168.1.2
Linux:
添加:
[root@demo ~]# ifconfig eth0:0 10.0.0.128 netmask 255.255.255.0 up
[root@demo ~]# ifconfig eth0:0
eth0:0 Link encap:Ethernet HWaddr 00:24:21:1D:D8:9E
inet addr:10.0.0.128 Bcast:10.0.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:28 Base address:0x6000
删除:
[root@demo ~]# ifconfig eth0:0 down
这里额外提一下双网卡帮定的方式:
[root@hnoracle2 ~]# cd /etc/sysconfig/network-scripts
[root@hnoracle2 network-scripts]# ls
ifcfg-bond0 ifdown-aliases ifdown-post ifup-aliases ifup-ipx ifup-ppp init.ipv6-global
ifcfg-eth0 ifdown-ippp ifdown-ppp ifup-ib ifup-isdn ifup-routes network-functions
ifcfg-eth1 ifdown-ipsec ifdown-sit ifup-ippp ifup-plip ifup-sit network-functions-ipv6
ifcfg-lo ifdown-ipv6 ifdown-sl ifup-ipsec ifup-plusb ifup-sl
ifdown ifdown-isdn ifup ifup-ipv6 ifup-post ifup-wireless
[root@hnoracle2 network-scripts]# cat ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
USERCTL=no
[root@hnoracle2 network-scripts]# cat ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none
USERCTL=no
[root@hnoracle2 network-scripts]# cat ifcfg-bond0
DEVICE=bond0
IPADDR=10.0.0.90
NETMASK=255.255.255.0
NETWORK=10.0.0.0
BROADCAST=10.0.0.255
GATEWAY=10.0.0.1
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
[root@hnoracle2 cat /etc/rc.local
ifenslave bond0 eth0 eth1
Master 'bond0': Error: handshake with driver failed. Aborting
重启网络
service
添加路由
route add -net 10.0.0.0 netmask 255.255.255.0 bond0
AIX6.1
添加
lbq:/#>ifconfig en0 172.16.0.205 netmask 255.255.255.0 broadcast 172.16.0.255 alias
lbq:/#>ifconfig en0
en0: flags=1e080863,c0<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD(ACTIVE),LARGESEND,CHAIN>
inet 172.16.0.206 netmask 0xffffff00 broadcast 172.16.0.255
inet 172.16.0.205 netmask 0xffffff00 broadcast 172.16.0.255
tcp_sendspace 131072 tcp_recvspace 65536 rfc1323 0
删除
lbq:/#>ifconfig en0 172.16.0.205 delete
- 主流操作系统中给网卡添加内存IP
- 给网卡设备添加两个IP别名(一个网卡绑定多个ip)
- Linux 查看CPU/内存/网卡/操作系统信息
- 给自己的电脑添加虚拟网卡
- 给nova虚机添加网卡
- 如何给linux添加IP?
- 为网卡批量添加IP地址
- linux 为网卡添加多个IP
- 为linux网卡添加多个IP
- Linux 一个网卡添加多个IP
- 在vcenter中给linux虚拟机添加网卡,但找不到的问题。
- linux给虚拟机添加内存
- nmcli添加网卡 并且修改设备名字 添加IP地址
- Linux操作系统单网卡双IP的设置
- 如何给同一块网卡绑定多个IP地址
- 给windows和ubuntu单网卡设置双ip…
- 如何给树莓派的无线网卡设置静态IP地址
- 怎样给电脑添加一个IP
- 父子节点问题
- 关于echo %classpath% 曾经错误的改正
- JSP中常见的错误及其处理方式
- Np16、输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
- Domain 的Value Range 值转换 (Conversion Routine) .
- 主流操作系统中给网卡添加内存IP
- 各种排序算法的实现及其比较
- Unity3d 模型的淡入淡出
- CPU私有变量(per-CPU变量)
- gdb断点调试的两个技巧-condition和ignore
- 解决android程序调用摄像头黑屏
- web测试 (五)安全测试
- unity3d lightmap简单步骤
- linux 命令杀tomcat 进程