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

来源:互联网 发布:qt 编程视频教程 编辑:程序博客网 时间:2024/04/30 10:52

因为有些时候项目需要,几大主流操作系统如下:

注:此方法是存在内存中的虚拟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 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

     

   编辑/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