Socket using the AF_INET protocol family, and create Sock_raw original set of words, their own IP header and TCP head, when familiar with the next head structure.
* ===================================================================================== * * FILENAME:RAW.C * *
Description: Send the TCP protocol using the original socket and take your own data. * * version:1.0 * created:2012 year September 11 10:39 00 seconds * Revision: * COMPILER:GCC * AUTHOR:YADON.Z * * =====================================================================================/#in Clude <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include < netinet/in.h> #include <netinet/ip.h> #include <netinet/tcp.h> #include <arpa/inet.h> #define Data "Hello" #define packet_size sizeof (struct IPHDR) + sizeof (struct TCPHDR) + sizeof (data)/*-------------------------- -------------------------------Function name:check_sum () Descrypthon: Checksum calculation, excerpt from UNP source------------------------------
------------------------------* * unsigned short check_sum (unsigned short *addr, int len) {int nleft = Len; int sum = 0;
unsigned short *w = addr;
Short answer = 0;
while (Nleft > 1) {sum + = *w++;
Nleft-=2;
} if (nleft = = 1) {* (unsigned char *) (&answer) = * (unsigned char *) W;
sum + + answer;
sum = (sum >>) + (sum & 0xFFFF);
sum + = (sum >> 16);
Answer = ~sum;
return answer; }/*---------------------------------------------------------Function Name:init_socket () Descrypthon: Initialize socket, using Original socket------------------------------------------------------------*/int init_socket (int sockfd, struct sockaddr_in *
target,\ const char *DST_ADDR, const char *dst_port) {CONST int flag = 1;
target->sin_family = af_inet;
Target->sin_port = htons (atoi (Dst_port));
if (Inet_aton (dst_addr, &target->sin_addr) = = 0) {perror ("Inet_aton fail\n");
Exit (-1); } if ((SOCKFD = socket (af_inet, Sock_raw, ipproto_tcp)) < 0) {perror ("ErroR ");
Exit (-1); } if (setsockopt (Sockfd,ipproto_ip, Ip_hdrincl, &flag, sizeof (flag)) < 0) {perror ("setsockopt fail \ n")
);
Exit (-1);
return SOCKFD; }/*---------------------------------------------------------------Function NAME:BUILE_IPHDR () Descrypthon: Building IP Headers Data, the source address uses pseudo random address-----------------------------------------------------------------/void Buile_iphdr (struct sockaddr
_in *target, char *buffer) {struct IPHDR *ip = (struct IPHDR *) (buffer);
Ip->version = 4;
IP->IHL = 5;
Ip->tos = 0;
Ip->tot_len = htons (packet_size);
Ip->id = 0;
Ip->frag_off = 0;
Ip->ttl = 255;
Ip->protocol = ipproto_tcp;
Ip->check = 0;
IP->SADDR = random ();
IP->DADDR = target->sin_addr.s_addr;
Ip->check = check_sum (unsigned short *) IP, sizeof (struct IPHDR) + sizeof (DATA)); }/*---------------------------------------------------------------Function name:buile_tCPHDR () Descrypthon: Constructs the TCP header information, joins some own data, then carries on the checksum computation. -----------------------------------------------------------------*/void Buile_tcphdr (struct sockaddr_in *target,
const Char *src_port, char *buffer) {struct TCPHDR *tcp = (struct TCPHDR *) (buffer);
Tcp->source = htons (atoi (Src_port));
Tcp->dest = target->sin_port;
Tcp->seq = random ();
Tcp->doff = 5;
Tcp->syn = 1;
Buffer + + sizeof (struct TCPHDR);
memcpy (buffer, data, sizeof (data));
Tcp->check = check_sum (unsigned short *) TCP, sizeof (struct TCPHDR) + sizeof (DATA));
int main (int argc, const char *argv[]) {char *buffer;
char *buffer_head = NULL;
int sockfd = 0;
struct sockaddr_in *target;
if (argc!= 4) {printf ("usage:destination addresss, Destination port, source port \ n");
Exit (-1);
const char *DST_ADDR = argv[1];
const char *dst_port = argv[2];
const char *src_port = argv[3]; target = Calloc (sizeof (struct sockaddr_in), 1);
Buffer = Calloc (packet_size, 1);
Buffer_head = buffer;
SOCKFD = Init_socket (SOCKFD, Target, dst_addr, dst_port);
BUILE_IPHDR (target, buffer);
Buffer + + sizeof (struct IPHDR);
BUILE_TCPHDR (target, src_port, buffer); SendTo (SOCKFD, Buffer_head, packet_size, 0,\ (struct sockaddr *) target, sizeof (struct SOCKAD
dr_in));
Free (buffer_head);
Free (target);
return 0;
}