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

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

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值