原始套接字编程----简单的发送SYNtcp数据

 

1、首先要明白的是:你发送的TCP数据到底是怎样构造的吧?

2、TCP数据报的构成方式:

    

这是TCP头部-------如果无TCP的选项其头部大小为20个字节;

3、下面要明白IP头部的大小:

   

4、构造头部:

   ip 头部:

struct ip * ip=calloc(1, sizeof(struct ip));
   ip->ip_dst.s_addr=inet_addr(dst);
   ip->ip_src.s_addr=inet_addr(src);
   ip->ip_hl=sizeof(struct ip)/4;
   ip->ip_sum=0;
   ip->ip_v=IPVERSION;
   ip->ip_tos=0;
   ip->ip_ttl=MAXTTL;
   ip->ip_len=sizeof(struct ip)+sizeof(struct tcphdr)+len;
   ip->ip_off=0;
   ip->ip_id=0;
   ip->ip_sum=0;
   ip->ip_p=IPPROTO_TCP;


  构造tco头部:

   struct tcphdr * tcp=calloc(1, sizeof(struct tcphdr));
    tcp->th_dport=htons(det_port);
    tcp->th_sport=htons(det_port);
    tcp->th_off=sizeof(struct tcphdr)/4;
    tcp->th_win=htons(4096);
    tcp->th_sum=0;
    tcp->th_flags=TH_ACK;

    /*

     BSD内核

    */

  具体查看    /usr/include/netinet/ip.h  与tcp.h

4、 具体就是一个构造一个发送的空间:

   sockfd=socket(PF_INET,SOCK_RAW,IPPROTO_TCP);
    if(sockfd<0)
       {
           err_quit("socket", sockfd);
       }
    if(setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on, sizeof(on))==-1)
    {
        err_quit("setsocket", -2);
    }

 5、最后就是利用SENDTo 函数发出-

num=sendto(sockfd,final_data,strlen(final_data),0,(struct sockaddr*)&server,sizeof(server));  

这些都是很简单的,大家一般都是很清楚的,我就不给出具体的代码了,大家都明白怎样写的,主要是明白-----网络通信的原理,TCP/IP原理




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值