原始套接字编程----简单的发送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原理