求c++daolao看看错误

dongjue123 2018-01-07 04:14:09

typedef struct iphdr{
unsigned int headlen:4;
unsigned int wersion:4;
unsigned char tos;
unsigned short totallen;
unsigned short id;
unsigned short flag;
unsigned char ttl;
unsigned char prot;
unsigned short checksum;
unsigned int sourceip;
unsigned int destip;
}IpHeader;

typedef struct icmphdr{
typedef unsigned char BYTE;
BYTE type;
BYTE code;
typedef unsigned char USHORT;
USHORT checksum;
USHORT id;
USHORT seq;
}Icmpheader;

#define ICMP_ECHO 8 //请求回送
#define DEF_PACKET_SIZE 32 //缺省数据报长度
#define MAX_PACKET 1024 //最大数据报长度
char icmp_data[MAX_PACKET]; //ICMP数据报最大可能长度
*Memset(icmp_data,0,MAX_PACKET); //将数据报清空初始化
Int datasize=DEF_PACKET_SIZE; //ICMP数据报报文体的额缺省长度
Datasize+=sizeof(icmpHeader); //加上ICMP数据头部
icmp_header *icmp_hdr;
char *datapart;
icmp_hdr=(icmpheader*)icmp_data;
icmp_hdr->type=icmp_echo; //设置类型
icmp_hdr->id=(ushort)getcurrentthreadid(); //设置其ID号为当前线程号
datapart=icmp_data+sizeof(icmpheader); //计算出ICMP数据报的数据部分
memset(datapart,'A',datasize-sizeof(icmphearder)); //填入数据
((IcmpHeader*)icmp_data)->seq=0; //序列号
((IcmpHeader*)icmp_data)->check_sum=0; //先将检验和置0
((IcmpHeader*)icmp_data)->checksum=checksum(USHORT*)
icmp_data,data_size); //Checksum 为计算校验和的函数,设校验和初值为0,然后对数据每16位求异或,结果取反,便得校验和。
//其代码如下:
unsinged 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);
//填充ICMP报文之后,应在ICMP报文之前加上IP报头并发送出去。可调用 下面的代码发送数据包。注意,这里的dest是填入目的主机的IP地址的一个sockaddr_in数据结构,IP_STRING是目的的主机的IP地址字符串。
Struct sockaddr_in_dest;
Dest.sin_family=AF_INET;
Dest.sin_addr.s_addr=inet_addr(IP_STRING);
Sendto(sockraw,icmp_data,datasize,0,(sockaddr*)&dest,size of(dest));

#define ICMP_MIN 8
#defineMAX_PING_PACKET_SIZE(MAX_PACKET+sizeof(IpHeader))
char *recvbuf=new[MAX_PING_PACKET_SIZE];
struct sockaddr_in dest,from,end;
int formlen=sizeof(from);
int bytes=recvfrom(sockraw,recvbuf,MAX_PACKET,0,(Struct sockaddr*)&from,&fromlen)
ipheader *iphdr;
icmpheader *icmphdr;
unsigned short iphdrlen;
iphdr=(ipheader*)buf;
iphdrlen=iphdr->headlen*4; //IP报头的长度
icmphdr=(icmpheader *)(buf+iphdrlen); //跳过IP头
//数据包太短丢弃
if(bytes<iphdrlen+icmp_min) return; //不是回送请求(ping应答),丢弃
if(icmphdr->type!=icmp_echo_reply) return; //ID不相符,丢弃
if(icmphdr->id!=(USHORT)getcurrentthreadid()) return; //输出正在使用的IP地址
cout<<"活动主机"<<inet_ntoa(from->sin_addr)<<endl;
...全文
325 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-01-08
  • 打赏
  • 举报
回复
坊间传闻,Windows限制使用RAW Socket
FoolCarpe 2018-01-08
  • 打赏
  • 举报
回复
什么错误?

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧