诡异的sendto错误Invalid argument
附上我的程序,一个自写的ping程序,顺便问问大家stderr输出sendto Invalid argument,这都有哪些情况?我看了好久都不知道这程序为什么错,是在linux下写的。
#include<sys/socket.h>#include<sys/types.h>#include<netinet/in.h>#include<stdio.h>#include<errno.h>#include<string.h>#include<unistd.h>//#include"header.h"#define MAXLEN 1024struct IcmpHeader{ unsigned char type; unsigned char code; unsigned short checksum; union { struct { unsigned short id; unsigned short seq; }echo; unsigned int gateway; struct { unsigned short unused; unsigned short mtu; }frag; }un;};struct IpHeader{ unsigned char head; unsigned char tos; unsigned short total_len; unsigned short flags; unsigned short offset; unsigned char ttl; unsigned char protoc; unsigned short checksum; unsigned int sourceip; unsigned int destip;};int pingflags=0;int conflags=0;int synflags=0;int finflags=0;int udpflags=0;unsigned short _checksum(unsigned short *ptr,int nbytes){ unsigned int sum=0; unsigned short checksum; unsigned *oddbyte; while(nbytes>1) { sum+=*ptr; ptr++; nbytes-=2; } if(nbytes==1) { *oddbyte=0; oddbyte=(char*)ptr; sum+=*oddbyte; } sum=(sum>>16)+(sum&0xffff); sum+=(sum>>16);// safe checksum=~sum; return (checksum);}int ping(char *targetip){ int ret; int pingsock; int sendbufsize;// struct IpHeader *ip;// struct IcmpHeader *icmp; 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)); 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,&pingtaraddr,sizeof(pingtaraddr)); if(ret<=0){ printf("send to error\n"); printf("%m\n",errno); } else printf("send !\n"); return 0;}int main(int argc,char *argv[]){ char sendbuff[MAXLEN]; char recvbuff[MAXLEN]; char targetip=""; int ret=0; char message[]= "-p Ping Scan\n-c TCP connect Scan\n-s TCP SYN Scan\n-f TCP FIN Scan\n-u UDP Scan\n"; int ch; if(argc==1) { printf("%s\n",message); } else { while((ch=getopt(argc,argv,"hp:c:s:f:u:"))!=EOF) { switch(ch) { case 'h':printf("%s\n",message); break; case 'p':pingflags=1; printf("%s\n",argv[2]); break; case 'c':pingflags=1; conflags=1; break; case 's':pingflags=1; synflags=1; break; case 'f':pingflags=1; finflags=1; break; case 'u':pingflags=1; udpflags=1; break; } } } if(pingflags==1) { ret=ping(argv[2]); } return 0;}