資源簡介
網(wǎng)上看到很多關(guān)于Raw Socket實(shí)現(xiàn)UDP數(shù)據(jù)包發(fā)送的例子,可是沒有IPINIP形式的UDP數(shù)據(jù)包發(fā)送,因此自己實(shí)現(xiàn)了一個(gè)。
環(huán)境:gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)
語言:C
代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#define?BUFLEN?1000
#define?PORT?8848
typedef?struct?ip_hdr{//ipv4頭部?
unsigned?int?ip_length:4;?/*little-endian*/
unsigned?int?ip_version:4;
unsigned?char?ip_tos;
unsigned?short?ip_total_length;
unsigned?short?ip_id;
unsigned?short?ip_flags;
unsigned?char?ip_ttl;
unsigned?char?ip_protocol;
unsigned?short?ip_cksum;
unsigned?int?ip_source;
unsigned?int?ip_dest;
}ip_hdr;
typedef?struct?udp_hdr{//udp頭部
unsigned?short?s_port;
unsigned?short?d_port;
unsigned?short?length;
unsigned?short?cksum;
}udp_hdr;
typedef?struct?psd_header{//偽頭部,用于計(jì)算校驗(yàn)和
unsigned?int?s_ip;//source?ip
unsigned?int?d_ip;//dest?ip
unsigned?char?mbz;//0
unsigned?char?proto;//proto?type
unsigned?short?plen;//length
}psd_header;
unsigned?short?checksum(unsigned?short*?buffer?int?size)//校驗(yàn)和
{
unsigned?long?cksum?=?0;
while(size>1){
cksum?+=?*buffer++;
size?-=?sizeof(unsigned?short);
}
if(size){
cksum?+=?*(unsigned?char*)buffer;
}
cksum?=?(cksum>>16)?+?(cksum&0xffff);?//將高16bit與低16bit相加
cksum?+=?(cksum>>16);?//將進(jìn)位到高位的16bit與低16bit?再相加
return?(unsigned?short)(~cksum);
}
int?main(int?argc?char?*argv[])
{
char?buf[BUFLEN];
int?sockfd?=?-1;
????
struct?sockaddr_in6?host_addr;
if((sockfd?=?socket(AF_INET6?SOCK_RAW?IPPROTO_IPIP))<0){
perror(“socket()?error:“);
exit(1);
}
bzero(&host_addrsizeof(host_addr
評(píng)論
共有 條評(píng)論