生活随笔
收集整理的這篇文章主要介紹了
raw socket 编程实例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
raw socket編程實例
2016年12月01日 00:58:28 1685人閱讀 收藏 舉報
分類: 網絡編程(5)
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/nice_wen/article/details/53416063
由于最經做模擬TCP三次握手的實驗,需要用到raw socket編程。
運行第一段代碼,發送ip數據報,第二段代碼接收ip數據報。需要運行第二段代碼,否則將無法接收數據報。
[cpp] view plaincopy
<span?style="font-size:18px;">#include<stdio.h>??#include<string.h>??#include<stdlib.h>??#include<sys/socket.h>??#include<sys/types.h>??#include<netinet/in.h>????struct?iphead{?????[cpp] view plaincopy
<span?style="font-size:18px;"><span?style="white-space:pre;">???????</span>??????unsigned?char?ip_hl:4,?ip_version:4;????????unsigned?char?ip_tos;??????unsigned?short?int?ip_len;?????????unsigned?short?int?ip_id;??????unsigned?short?int?ip_off;????????unsigned?char?ip_ttl;??????unsigned?char?ip_pro;??????unsigned?short?int?ip_sum;??????unsigned?int?ip_src;??????unsigned?int?ip_dst;??};????struct?icmphead{????????unsigned?char?icmp_type;??????unsigned?char?icmp_code;??????unsigned?short?int?icmp_sum;??????unsigned?short?int?icmp_id;??????unsigned?short?int?icmp_seq;??};????unsigned?short?int?cksum(char?buffer[],?int?size){?????????unsigned?long?sum?=?0;??????unsigned?short?int?answer;??????unsigned?short?int?*temp;??????temp?=?(short?int?*)buffer;??????for(?;?temp<buffer+size;?temp+=1){??????????sum?+=?*temp;??????}??????sum?=?(sum?>>?16)?+?(sum?&?0xffff);??????sum?+=?(sum?>>?16);??????answer?=?~sum;??????return?answer;??}????int?main(){???????????int?sockfd;??????struct?sockaddr_in?conn;??????struct?iphead?*ip;??????struct?icmphead?*icmp;??????unsigned?char?package[sizeof(struct?iphead)?+?sizeof(struct?icmphead)];????????memset(package,?0,?sizeof(package));????????ip?=?(struct?iphead*)package;??????icmp?=?(struct?icmphead*)(package+sizeof(struct?iphead));???????sockfd?=?socket(AF_INET,?SOCK_RAW,?IPPROTO_ICMP);???????if(sockfd?<?0){??????????printf("Create?socket?failed\n");??????????return?-1;??????}??????conn.sin_family?=?AF_INET;??????conn.sin_addr.s_addr?=?inet_addr("192.168.230.135");??????int?one?=?1;??????if(setsockopt(sockfd,?IPPROTO_IP,?IP_HDRINCL,?&one,?sizeof(one))?<?0){????????????printf("setsockopt?failed!\n");??????????return?-1;??????}??????????????ip->ip_version?=?4;???????ip->ip_hl?=?5;??????ip->ip_tos?=?0;??????ip->ip_len?=?htons(sizeof(struct?iphead)?+?sizeof(struct?icmphead));???????ip->ip_id?=?htons(1);??????ip->ip_off?=?htons(0x4000);??????ip->ip_ttl?=?10;??????ip->ip_pro?=?IPPROTO_ICMP;??????ip->ip_src?=?htonl(inet_addr("192.168.230.135"));??????ip->ip_dst?=?htonl(inet_addr("192.168.230.135"));??????printf("ipcksum?:?%d\n",?cksum(package,?20));???????ip->ip_sum?=?cksum(package,?20);????????????????????icmp->icmp_type?=?8;??????icmp->icmp_code?=?0;??????icmp->icmp_id?=?1;??????icmp->icmp_seq?=?0;??????icmp->icmp_sum?=?(cksum(package+20,?8));????????????if(sendto(sockfd,?package,?htons(ip->ip_len),?0,(struct?sockaddr?*)&conn,?sizeof(struct?sockaddr))?<?0){??????printf("send?failed\n");???????return?-1;??????}??????printf("send?successful\n");??????????return?0;??}</span>??
[plain] view plaincopy
<span?style="font-size:18px;">#include<stdio.h>??#include<string.h>??#include<stdlib.h>??#include<sys/socket.h>??#include<sys/types.h>??#include<netinet/in.h>??#include<unistd.h>??#include<linux/if_ether.h>????unsigned?short?int?cksum(char?buffer[],?int?size){??//校驗函數??????unsigned?long?sum?=?0;??????unsigned?short?int?answer;??????unsigned?short?int?*temp;??????temp?=?(short?int?*)buffer;??????for(?;?temp<buffer+size;?temp+=1)??????????sum?+=?*temp;??????sum?=?(sum?>>?16)?+?(sum?&?0xffff);??????sum?+=?(sum?>>?16);??????answer?=?~sum;??????return?answer;??}????int?main(){??????unsigned?char?buffer[1024];??????????//??int?sockfd?=?socket(AF_INET,?SOCK_RAW,?IPPROTO_ICMP);//不知為啥,無法設置原始套接字在網絡層抓IP數據報??????int?sockfd?=?socket(PF_PACKET,?SOCK_RAW,?htons(ETH_P_IP));?//此處,利用原始套接字在數據鏈路層抓取MAC幀,去掉??????if(sockfd?<?0){????????????????????????????????????????????//14個字節的MAC幀首部即可??????????printf("create?sock?failed\n");??????return?-1;??????}??????????int?n?=?recvfrom(sockfd,?buffer,?1024,?0,?NULL,?NULL);?//接收MAC幀????????printf("receive?%d?bytes\n",?n);??????for(int?i=14;?i<n;?i++){??????//去掉MAC幀首部,直接輸出IP數據報每個字節的數據??????if((i-14)?%?16?==?0)??????????printf("\n");??????printf("%d?",buffer[i]);??????}??????printf("\n");??????printf("ipcksum:?%d\n",?cksum(buffer+14,?20));?//此處再次校驗時,應當輸出0??????return?0;??}</span>??
這是之前參考過的一篇文章,寫的還可以:http://www.it165.net/pro/html/201208/3450.html
總結
以上是生活随笔為你收集整理的raw socket 编程实例的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。