almon123 almon123
关注数: 2 粉丝数: 43 发帖数: 1,142 关注贴吧数: 20
求助以下关于ping功能实现的代码问题 我参考网上的内容写了一段实现ping功能的代码,但是在执行时,不论ping什么地址都是显示成功,实在发现不了哪里有问题,求指点迷津。 代码如下: //全局变量 //icmp header //This is not the standard header, but we reserve space for time typedef struct _icmphdr { BYTE i_type; BYTE i_code; USHORT i_cksum; USHORT i_id; USHORT i_seq; ULONG timestamp; } IcmpHeader; //封装的方法 //计算ICMP校验码 USHORT CTransmitDlg::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); } //Ping主函数 int CTransmitDlg::Ping() { //WinSocket服务初始化 WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 1), &wsaData) != 0) { AfxMessageBox("WSAStartup() failed:%d\n", GetLastError()); return -1; } //变量 char recvbuf[100]; //接受的数据 int timeout = 1000; //超时 struct sockaddr_in from; //发送方结构体 int fromlen = sizeof(from); //发送方结构大小 struct sockaddr_in dest; //接收方 memset(&dest, 0, sizeof(dest)); //接收方清零 CString t_ip; //临时IP存储 CString t_port; //临时端口存储 CString t_msg, t_msgerr; //临时显示信息 long nLength = 0; //显示区信息长度 //创建并设置套接字 SOCKET sockRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED); if (sockRaw == INVALID_SOCKET) { AfxMessageBox("WSASocket() failed:%d\n", WSAGetLastError()); return -1; } setsockopt(sockRaw, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)); //GetDlgItemText(IDC_IPADDRESS_SERVER, t_ip); t_ip = "192.168.0.1"; GetDlgItemText(IDC_EDIT_SERVER_PORT, t_port); dest.sin_family = AF_INET; //Family dest.sin_addr.s_addr = inet_addr(t_ip); //IP地址 dest.sin_port = (u_short) atoi(t_port); //端口号 //制作ICMP头 char* icmp_data = new char[10]; memset(icmp_data,0,sizeof(icmp_data)); ((IcmpHeader*)icmp_data)->i_type = 8; //为8表示回送请求 ((IcmpHeader*)icmp_data)->i_code = 0; ((IcmpHeader*)icmp_data)->i_id = (u_short)GetCurrentProcessId(); //获得进程ID作为ICMP的ID号 ((IcmpHeader*)icmp_data)->i_seq = 0; //序号 ((IcmpHeader*)icmp_data)->i_cksum = 0; //初始化校验码 //开始ping ((IcmpHeader*)icmp_data)->i_cksum = checksum((u_short *)icmp_data, 8);//计算校验码 sendto(sockRaw, icmp_data, 8, 0, (struct sockaddr*)&dest, sizeof(dest));//使用指定的套接字发送字节流数据到指定地址 int bread = recvfrom(sockRaw,recvbuf,100,0,(struct sockaddr*)&from, &fromlen);//接收数据 for(int i = 0; i < PING_TIMES; i++) { if (bread == SOCKET_ERROR) //接收数据失败 { t_msg.Format("第%d次尝试ping主机%s失败:错误 %ld...\r\n", i+1, t_ip, WSAGetLastError() ); nLength = m_ctrRichEdit.SendMessage(WM_GETTEXTLENGTH);//追加显示到编辑框里 m_ctrRichEdit.SetSel(nLength,nLength); m_ctrRichEdit.ReplaceSel(t_msg); continue; } else //接收数据成功 { t_msg.Format("第%d次尝试ping主机%s成功,内容:%ld 测试码:%d", i+1, t_ip, recvbuf, bread ); nLength = m_ctrRichEdit.SendMessage(WM_GETTEXTLENGTH);//追加显示到编辑框里 m_ctrRichEdit.SetSel(nLength,nLength); m_ctrRichEdit.ReplaceSel(t_msg); return 1; } } t_msgerr.Format("连接主机失败,正在尝试重连..."); nLength = m_ctrRichEdit.SendMessage(WM_GETTEXTLENGTH);//追加显示到编辑框里 m_ctrRichEdit.SetSel(nLength,nLength); m_ctrRichEdit.ReplaceSel(t_msgerr); return 0; }
请大家帮忙修改一下这个T,谢谢~ 技能效果:创造一个自身的幻影并将其向前推进700/800/900/1000距离,对经过路线上的敌人造成50/100/150/200点伤害和1.75/2/2.25/2.5秒的眩晕。幻影拥有本体30/40/50/60%的攻击力,受到500/400/300/200%的伤害,持续10/15/20/25秒。 我做的T是这样的: 事件:任意单位 发动技能效果 条件:(施放技能) 等于 该技能(原型是震荡波,不直接用穿刺做的原因是我需要投射物) 动作:设置 puter = 施法单位    设置 point = (从(施法单位)的位置)开始,距离(600.00 + (100.00 x (转换 (该技能 的等级对 (施法单位) 为实数))),方向为(((施法单位)的位置) 到 (技能施放点)的角度)度的位移处)    设置 majia1 = (新建((施法单位)的所有者)的 马甲 在 ((施法单位)的位置) 面向角度:((施法单位)的面向角度)度) 设置 3.00 秒 水元素 类型的生命周期对 majia1    添加 穿刺 给 majia1    设置 穿刺 等级 对 majia1 为(该技能 的等级对(施法单位))    对 majia1 发布 不死族地穴领主 - 穿刺 命令到目标点:point    设置 majia2 = (新建((施法单位)的所有者)的 马甲 在 ((施法单位)的位置) 面向角度:((施法单位)的面向角度)度)   设置 3.00 秒 水元素 类型的生命周期对 majia2    添加 幻象物品 给 majia2    设置 幻象物品 等级 对 majia2 为(该技能 的等级对(施法单位))    对 majia2 发布 物品技能 - 幻象权杖 命令到目标:施法单位    等待0.2秒    选取(半径为 512.00 圆心为(puter 的位置)且满足((((匹配单位)是镜像单位)等于 TRUE)and(((匹配单位)的类型)等于( puter 的类型))的所有单位)内所有单位做动作:              立即移动(选取单位)到 point 现在有三个(及以上,我水平有限只发现三个)BUG: 1.在不同地形上,马甲施放技能有延迟。经常后面那个单位组动作就放不出来了,然后幻象就停在你边上。 2.同样,在point不可达到的地方,幻象也不移动…… 3.我只想移动最后由该技能创造的幻象,但我不会……囧,所以现在我这个是会把所有512范围内的幻象都移过去,哪位高手帮我想个办法…… 4.投射物是一个单位模型,然后他就非要播这个单位死掉的动画,这个能去掉吗? 请各位高手帮我把这个技能修改修改(重做也没关系……呜~),至少把这几个BUG去掉,感激不尽……
1 下一页