读书人

诡异的sendto异常Invalid argument

发布时间: 2012-04-17 15:06:33 作者: rapoo

诡异的sendto错误Invalid argument
附上我的程序,一个自写的ping程序,顺便问问大家stderr输出sendto Invalid argument,这都有哪些情况?我看了好久都不知道这程序为什么错,是在linux下写的。

C/C++ code
#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;} 


例如输入./xxx -p 192.168.64.100,会sendto错误。

[解决办法]
perror得到错误号

读书人网 >C语言

热点推荐