免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2998 | 回复: 11

[C] 高手进来看看!! [复制链接]

论坛徽章:
0
发表于 2008-08-28 15:26 |显示全部楼层
10可用积分
在linux下我用libnet库写了一个发送数据包的程序,发送的是tcp数据包。构造ip头时,当源ip地址为本机的ip时,数据包能成功发送到目的端。而当源ip地址改为其他时,目的端就不能收到数据包了,这是什么原因?
下面是数据包构造的情况:
    t = libnet_build_tcp(
        src_prt,                                    /* source port */
        dst_prt,                                    /* destination port */
        0x01010101,                                 /* sequence number */
        0x02020202,                                 /* acknowledgement num */
        TH_SYN,                                     /* control flags */
        32767,                                      /* window size */
        0,                                          /* checksum */
        10,                                         /* urgent pointer */
        LIBNET_TCP_H + payload_s,                   /* TCP packet size */
        payload,                                    /* payload */
        payload_s,                                  /* payload size */
        l,                                          /* libnet handle */
        0);                                         /* libnet id */
    if (t == -1)
    {
        fprintf(stderr, "Can't build TCP header: %s\n", libnet_geterror(l));
        goto bad;
    }

    t = libnet_build_ipv4(
        LIBNET_IPV4_H + LIBNET_TCP_H + payload_s,   /* length */
        0,                                          /* TOS */
        242,                                        /* IP ID */
        0,                                          /* IP Frag */
        64,                                         /* TTL */
        IPPROTO_TCP,                                /* protocol */
        0,                                          /* checksum */
        src_ip,                                     /* source IP */
        dst_ip,                                     /* destination IP */
        NULL,                                       /* payload */
        0,                                          /* payload size */
        l,                                          /* libnet handle */
        0);                                         /* libnet id */
    if (t == -1)
    {
        fprintf(stderr, "Can't build IP header: %s\n", libnet_geterror(l));
        goto bad;
    }

论坛徽章:
0
发表于 2008-08-28 15:36 |显示全部楼层
用TCP协议传输的话,对端接收到了你的数据会发送一个ACK过来。如果你构造的源IP地址为其它的IP时,那么对方的ACK就不会发送到你的机器上面来了,所以说你的机器没有收到ACK,就会报传输失败的错误。

论坛徽章:
0
发表于 2008-08-28 15:47 |显示全部楼层

回复 #2 scutan 的帖子

我不一定要求能收到回复,现在的问题是目的端都收不到连接的数据包的

论坛徽章:
0
发表于 2008-08-28 22:34 |显示全部楼层

看一下网络编程的书。

TCP传数据之前要三次握手的,你一次都没握,当然不能传数据了,所以你的目的端没有收到数据是正常。

论坛徽章:
0
发表于 2008-08-29 09:41 |显示全部楼层
其实这个没什么讨论的,采用TCP或者是UDP,都是通过SOCKET这个API来实现,源IP+源PORT+服务IP+服务PORT确定一个连接。这是三次握手的基本条件。

论坛徽章:
0
发表于 2008-08-29 13:51 |显示全部楼层

回复 #1 xutaota2003 的帖子

先建立连接,再发送你自己构造的数据报不久可以么 ?

论坛徽章:
0
发表于 2008-08-29 14:01 |显示全部楼层
原帖由 babyyellow 于 2008-8-29 13:51 发表
先建立连接,再发送你自己构造的数据报不久可以么 ?


这样人家就知道他拉

论坛徽章:
0
发表于 2008-08-29 14:12 |显示全部楼层
将你的机器的IP FORWORD打开再实验看

论坛徽章:
0
发表于 2008-08-29 15:24 |显示全部楼层

回复 #8 思一克 的帖子

IP FORWORD是打开的

用本机的ip地址做为源地址能发送包的 改成别的源ip地址就不行了

论坛徽章:
0
发表于 2008-08-29 16:05 |显示全部楼层
你IP FWD打开了吗?

原帖由 xutaota2003 于 2008-8-29 15:24 发表
IP FORWORD是打开的

用本机的ip地址做为源地址能发送包的 改成别的源ip地址就不行了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP