免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6442 | 回复: 2
打印 上一主题 下一主题

诡异的sendto Invalid argument [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-26 00:01 |只看该作者 |倒序浏览
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呢?

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
2 [报告]
发表于 2012-02-26 10:53 |只看该作者
看标题,就知道是rawsocket出了问题。因为你发送的数据包被协议栈拒收了。数据包有错误,好好检查一下吧。

论坛徽章:
0
3 [报告]
发表于 2012-02-26 13:58 |只看该作者
回复 2# mirnshi
谢谢啦,还真是,我传的sizeof(sendbuf)是指针的大小,所以数据包到网卡真被截了,发不出去


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP