各位高手,请问如何才能在自己编写的程序中动态设置IP。我已经采用过修改注册表的方法,但是发现修改成功后,网上邻居显示的IP地址依然还是以前设置的。不知道是否还有其它的方法。thank you very much!!!

解决方案 »

  1.   

    要想做个假的IP进行数据传递时,在程序设计中,可用下面的函数:
    WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED)
    当然,要用自己IP头结构及TCP头结构:
    typedef struct _iphdr              //定义IP首部{    unsigned char h_verlen;            //4位首部长度,4位IP版本号    unsigned char tos;               //8位服务类型TOS    unsigned short total_len;      //16位总长度(字节)    unsigned short ident;            //16位标识    unsigned short frag_and_flags;  //3位标志位    unsigned char  ttl;              //8位生存时间 TTL    unsigned char proto;         //8位协议 (TCP, UDP 或其他)    unsigned short checksum;        //16位IP首部校验和    unsigned int sourceIP;            //32位源IP地址    unsigned int destIP;         //32位目的IP地址}IP_HEADER;  struct                              //定义TCP伪首部{        unsigned long saddr;     //源地址        unsigned long daddr;     //目的地址        char mbz;        char ptcl;                   //协议类型        unsigned short tcpl;     //TCP长度}psd_header;  typedef struct _tcphdr             //定义TCP首部{    USHORT th_sport;               //16位源端口    USHORT th_dport;               //16位目的端口    unsigned int th_seq;         //32位序列号    unsigned int th_ack;         //32位确认号    unsigned char th_lenres;        //4位首部长度/6位保留字    unsigned char th_flag;            //6位标志位    USHORT th_win;                 //16位窗口大小    USHORT th_sum;                 //16位校验和    USHORT th_urp;                 //16位紧急数据偏移量}TCP_HEADER;
    之后,在每次发送报时,都要先改变自己的报头中的自己的假IP值,还要进行报头校验和
    校验函数可用下面函数:
    USHORT checksum(USHORT *buffer, int size){ unsigned long cksum=0;      while(size >1) {    cksum+=*buffer++;    size -=sizeof(USHORT);  }  if(size ) {    cksum += *(UCHAR*)buffer;  }  cksum = (cksum >> 16) + (cksum & 0xffff);  cksum += (cksum >>16);  return (USHORT)(~cksum);}
      

  2.   

    修改注册表需要重新启动机器才能改变IP地址。
    如果你不想重新启动机器就改变IP地址,使用微软的platform sdk中的两个函数
    AddIPAddress 
    DeleteIPAddress 
    注意:使用这两个函数后,从控制面板中看到的IP地址还是原来的,但是你可以通过ipconfig看到本机ip地址已经改变了。
      

  3.   

    用“iphelp”中描述的几个函数就可以做到。并且可以在同一个网卡上绑定多个ip地址。