如何动态设计IP 各位高手,请问如何才能在自己编写的程序中动态设置IP。我已经采用过修改注册表的方法,但是发现修改成功后,网上邻居显示的IP地址依然还是以前设置的。不知道是否还有其它的方法。thank you very much!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要想做个假的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);} 修改注册表需要重新启动机器才能改变IP地址。如果你不想重新启动机器就改变IP地址,使用微软的platform sdk中的两个函数AddIPAddress DeleteIPAddress 注意:使用这两个函数后,从控制面板中看到的IP地址还是原来的,但是你可以通过ipconfig看到本机ip地址已经改变了。 用“iphelp”中描述的几个函数就可以做到。并且可以在同一个网卡上绑定多个ip地址。 想看winuser.h的源代码 差 2 分,我散分先…… 高手救命--------内存泄露 初始化Combo Box控件问题 我是菜鸟,保证给分. dll在pb里调用报"该内存不能未"written""?我刚学vc,想作个dll在pb里调用 哪位有经验告诉我VC项目收费标准 怎样动态增删路由 Findwindow(),在线等(现结) 高分请教:有关ActiveX的一些问题 如何改变对话框的字体?? 如何把CImagelist中的其中一幅拷贝到CBitmap中?
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);}
如果你不想重新启动机器就改变IP地址,使用微软的platform sdk中的两个函数
AddIPAddress
DeleteIPAddress
注意:使用这两个函数后,从控制面板中看到的IP地址还是原来的,但是你可以通过ipconfig看到本机ip地址已经改变了。