- 论坛徽章:
- 0
|
int ping(char *targetip)
{
int ret;
int pingsock;
int sendbufsize;
struct sockaddr_in pingtaraddr;
char *sendbuf;
struct IpHeader *ip;
struct IcmpHeader *icmp;
pingsock=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
if(pingsock<0)
{
printf("pingsocket error\n");
exit(1);
}
int on=1;
// ret=setsockopt(pingsock,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));
ret=setsockopt(pingsock,0,IP_HDRINCL,&on,sizeof(on));
if(ret<0)
{
printf("setsockopt IP_HDRINCL error\n");
exit(1);
}
sendbufsize=sizeof(struct IpHeader)+sizeof(struct IcmpHeader);
sendbuf=(char*)malloc(sendbufsize);
memset(sendbuf,0,sizeof(sendbuf));
//pad IP header ;hostbyte to netbyte
ip=(struct IpHeader*)sendbuf;
ip->head=0;
ip->head=ip->head|0x45;
ip->tos=0;
ip->total_len=htons(sizeof(sendbuf));
ip->flags=rand();
ip->offset=0;
ip->ttl=64;
ip->protoc=1;//ICMP
ip->checksum=0;
ip->sourceip=inet_addr("192.168.64.102");//to banery;
ip->destip=inet_addr(targetip);
//pad ICMP header
icmp=(struct IcmpHeader*)(ip+1);
icmp->type=8;//ICMP_ECHO;
icmp->code=0;
icmp->un.echo.id=0;
icmp->un.echo.seq=0;
icmp->checksum=_checksum((unsigned short *)icmp,sizeof(struct IcmpHeader));
memset(&pingtaraddr,0,sizeof(pingtaraddr));
pingtaraddr.sin_family=AF_INET;
pingtaraddr.sin_addr.s_addr=inet_aton(targetip);
ret=sendto(pingsock,sendbuf,sizeof(sendbuf),0,(struct sockaddr*)&pingtaraddr,sizeof(pingtaraddr));
if(ret<=0){
printf("send to error\n");
// printf("%m\n",errno);
fprintf(stderr,"%s\n",strerror(errno));
}
else printf("send !\n");
return 0;
}
大家来探讨一下把,出现Invalid argument的情况都有哪些?
我貌似这sendto是按着书上的参考写的,怎么stderr的错误类型还是Invalid argument呢? |
|