免费注册 查看新帖 |

Chinaunix

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

connect调用所作的操作?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-27 19:11 |只看该作者 |倒序浏览
1) 没有使用connect调用,但已经给IP首部中的dst addr 赋值
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

    if(sockfd < 0)
    {
        perror("socket");
        return 0;
    }
   
    if(setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0)
    {
        perror("setsockopt");
        return 0;
    }
   
    .....

    ip_header->ip_dst.s_addr = htonl(inet_network("10.0.0.18"));
....

    write(sockfd, buf, buflen);
===> 此时,虽然设置了IP首部,但数据不能被发送,write调用出错,显示Destination address required

2) 使用connect调用,但没有给IP首部中的dst addr赋值(又或给以随机值)
sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.s_addr = htonl(inet_network("10.0.0.18"));

sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);


    if(sockfd < 0)
    {
        perror("socket");
        return 0;
    }
   
    if(setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0)
    {
        perror("setsockopt");
        return 0;
    }
    connect(sockfd, (struct sockaddr *)&sockaddr, sizeof(struct sockaddr_in));
    .....

    ip_header->ip_dst.s_addr = htonl(inet_network("172.21.8.18"));
....

    write(sockfd, buf, buflen);

==> write调用能把数据发送出去,抓包显示数据帧中的dst ip地址为172.21.8.18,而数据帧中的MAC地址为10.0.0.18的MAC地址

???

论坛徽章:
0
2 [报告]
发表于 2008-09-15 20:43 |只看该作者
connect会为socket绑定目的地址, 收包时, 会检查包的源地址, 不同于connect绑定的地址的包不会收到。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP