您的位置:首页 > 其它

主流操作系统中给网卡添加内存IP

2013-03-13 11:06 169 查看
因为有些时候项目需要,几大主流操作系统如下:

注:此方法是存在内存中的虚拟IP地址,即非静态,表示重启会丢失。对于静态IP,WINDOWS请参考netsh,Linux请参考setup等设置,AIX请参考smit mktcpip,本文不做讨论,比较简单。

有啥米问题QQ:285979593留言哒

由于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 ENDS
IP_MASK_STRING TYPEDEF IP_ADDRESS_STRING
IP_ADDR_STRING STRUCT
Next      DWORD             ?
IpAddress IP_ADDRESS_STRING <>
IpMask    IP_MASK_STRING    <>
Context   DWORD             ?
IP_ADDR_STRING ENDS
PIP_ADDR_STRING TYPEDEF PTR IP_ADDR_STRING
MAX_ADAPTER_DESCRIPTION_LENGTH  equ 128
MAX_ADAPTER_NAME_LENGTH         equ 256
MAX_ADAPTER_ADDRESS_LENGTH      equ 8
IP_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 ENDS
MIB_IF_TYPE_OTHER     equ 1
MIB_IF_TYPE_ETHERNET  equ 6
MIB_IF_TYPE_TOKENRING equ 9
MIB_IF_TYPE_FDDI      equ 15
MIB_IF_TYPE_PPP       equ 23
MIB_IF_TYPE_LOOPBACK  equ 24
MIB_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
.code
GetCmdParam 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:
ret
GetCmdParam  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,4
invoke 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

编辑/etc/modprobe.conf文件,加入以下红色标记的内容

[root@rac4 network-scripts]# vi /etc/modprobe.conf

alias scsi_hostadapter mptbase

alias scsi_hostadapter1 mptspi

alias scsi_hostadapter2 ata_piix

alias eth0 e1000

alias eth1 e1000

alias bond0 bonding

options bond0 miimon=100 mode=1

说明:

miimon是用来进行链路监测的,比如:miimon=100,那么系统每100ms监测一次链路连接状态,如果有一条线路不通就转入另一条线路;mode的值表示工作模式,他共有0,1,2,3四种模式,常用的为0,1两种。

mode=0表示load balancing (round-robin)为负载均衡方式,两块网卡都工作。

mode=1表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式,也就是说默认情况下只有一块网卡工作,另一块做备份.

加入/etc/rc.d/rc.local启动项 红色标记内容

[root@rac4 network-scripts]# vi /etc/rc.d/rc.local

#!/bin/sh

# This script. will be executed *after* all the other init scripts.

# You can put your own initialization stuff in here if you don't

# want to do the full Sys V style. init stuff.

touch /var/lock/subsys/local

ifenslave bond0 eth0 eth1

启动bond0

[root@rac4 network-scripts]# ifconfig bond0 10.250.7.220 up

重启网络

service network restart

添加路由

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: