编辑: 阿拉蕾 | 2019-07-06 |
Man you,*pbuf,*pman;
pbuf=(Man*)&buf[0];
you=*pbuf;
if(strcmp(me.IP,you.IP)!=0) //如果不是我自己发的报文 {bool if_new=1;
for(pman=me.next;
pman!=NULL;
pman=pman->next) {if(strcmp(pman->IP,you.IP)==0) //如果在链表中找到该IP {you.next=pman->next;
*pman=you;
if_new=0;
break;
收到的you的next为对方电脑里链表的next 为防止错误改写,先保护我的电脑里链表的next if(if_new) //如果在链表中找不到该IP,插入新加入玩家的记录 {pman=new Man;
pman=you;
pman->next=me.next;
me.next=pman;
在OnCreate中 初始化socket对象 sock.Create(5560,SOCK_DGRAM,NULL);
//初始化 socket对象 // 端口号,数据报方式(用UDP协议)//以下为获取本机IP地址的代码 char HostName[256];
LPSTR IpAddr;
struct in_addr inAddr;
gethostname(HostName,sizeof(HostName));
//获取主机名struct hostent FAR* lpHostEnt=gethostbyname(HostName);
IpAddr=lpHostEnt->h_addr_list[0];
memmove(&inAddr,IpAddr,4)获取主机名对应的IP地址,转换为标准格式 strcpy(me.IP,inet_ntoa(inAddr)记录本机的IP地址 在OnTimer 中定时将本机的人物信息发给其他计算机 CString b_ip;
b_ip="10.2.35.255";
//设置子网广播地址 //注:如果只针对一台计算机发则只需要设置对方地址,此时IP报文可以越过路由器sock.SendTo(&me,sizeof(Man),5560,b_ip,0);
//发送缓冲区,发送字节数,对方端口号,对方IP