原始套接字编程课程设计报告_第1页
原始套接字编程课程设计报告_第2页
原始套接字编程课程设计报告_第3页
原始套接字编程课程设计报告_第4页
原始套接字编程课程设计报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、原始套接字编程课程设计报告 姓名:王延兴 班级:9班 学号:54110904 原始套接字编程课程设计报告班级:11级9班学号:54110904姓名:王延兴一、 设计任务分析(一)实验环境操作系统:windows编程工具及集成开发环境:vc+(二)实验目的和要求实验目的:掌握原始套接字编程。实验要求:完成下列功能:(1)利用raw socket捕获网络数据包的程序模型socket_stream 流式套接字 socket_dgram socket_raw 原始套接字 ipproto_ip ip协议 ipproto_icmp internet控制消息协议,配合原始套接字可以实现ping的功能 ipp

2、roto_igmp internet 网关服务协议,在多播中用到在af_inet地址族下,有sock_stream、sock_dgram、sock_raw三种套接字类型。sock_stream也就是通常所说的tcp,而sock_dgram则是通常所说的udp,而sock_raw则是用于提供一些较低级的控制的;第3个参数依赖于第2个参数,用于指定套接字所用的特定协议,设为0表示使用默认的协议。 raw socket能够对较低层次的协议直接访问,网络监听技术很大程度上依赖于它。(2)能够抓取第二节课的并发服务器程序的服务器端或客户端的应用层数据,即:时间值,打印输出。2、 设计方案同一台主机不同进

3、程可以用进程号来唯一标识,但是在网络环境下进程号并不能唯一标识该进程。tcp/ip主要引入了网络地址、端口和连接等概念来解决网络间进程标识问题。套接字(socket)是一个指向传输提供者的句柄,tcp/ip协议支持3种类型的套接字,分别是流式套接字、数据报式套接字和原始套接字。流式套接字(socket_stream)提供了面向连接、双向可靠的数据流传输服务。数据报式套接字(socket_ dgram)提供了无连接服务,不提供无错保证。原始套接字(socket_raw)允许对较低层次的协议直接访问,比如ip、 icmp协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备,因为raw s

4、ocket可以自如地控制windows下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。比如,我们可以通过raw socket来接收发向本机的icmp、igmp协议包,或者接收tcp/ip栈不能够处理的ip包,也可以用来发送一些自定包头或自定协议的ip包。网络监听技术很大程度上依赖于socket_raw。本实验采用原始套接字进行捕获通过本主机的包并对本主机的包进行处理。u 各个函数功能: char * getprotocol(int proto) /获得协议类型send(cientsocket, tmp, (int)strlen(tmp), 0);

5、发送数据recv(cientsocket, recvbuffer, max_path, 0);接收数据wsastartup(makeword(2,2), &ws) 初始化套接字类库socket(af_inet, sock_stream, ipproto_tcp); 创建套接字bind(serversocket, (struct sockaddr*)&localaddr, sizeof(localaddr);绑定套接字 listen(serversocket, 10);侦听,队列大小为10u 设计思想: 采用原始套接字进行捕获通过本主机的包并对本主机的包进行处理。 3、 详细设计

6、头文件ip.h:详细代码:/定义标准的的tcp头和ip头#define urg 0x20#define ack 0x10#define psh 0x08#define rst 0x04#define syn 0x02#define fin 0x01typedef struct _iphdr /定义ip首部unsigned char h_verlen; /4位首部长度+4位ip版本号unsigned char tos; /8位服务类型tosunsigned short total_len; /16位总长度(字节)unsigned short ident; /16位标识unsigned short

7、 frag_and_flags; /3位标志位unsigned char ttl; /8位生存时间 ttlunsigned char proto; /8位协议 (tcp, udp 或其他)unsigned short checksum; /16位ip首部校验和unsigned int sourceip; /32位源ip地址unsigned int destip; /32位目的ip地址ip_header;typedef struct _tcphdr /定义tcp首部ushort th_sport; /16位源端口ushort th_dport; /16位目的端口unsigned int th_s

8、eq; /32位序列号unsigned int th_ack; /32位确认号unsigned char th_lenres; /4位首部长度/6位保留字unsigned char th_flag; /6位标志位ushort th_win; /16位窗口大小ushort th_sum; /16位校验和ushort th_urp; /16位紧急数据偏移量tcp_header;/ 定义icmp首部typedef struct icmp_hdrunsigned char i_type; / 类型unsigned char i_code; / 代码unsigned short i_cksum; / 校

9、验码unsigned short i_id; / 非标准的icmp首部 unsigned short i_seq;unsigned long timestamp;icmp_header;typedef struct udp_hdr / 8 bytes 定义udp首部unsigned short uh_sport; unsigned short uh_dport;unsigned short uh_len;unsigned short uh_sum;udp_header;源文件: 详细代码:#include<stdio.h>#include<winsock2.h>#pra

10、gma comment(lib,"ws2_32")#define sio_rcvall _wsaiow(ioc_vendor,1)struct ip / 定义ip首部 unsigned char h_verlen; / 4位首部长度,4位ip版本号 unsigned char tos; / 8位服务类型tos unsigned short ip_length; / 16位总长度(字节) unsigned short ident; / 16位标识 unsigned short frag_and_flags; / 3位标志位 unsigned char ttl; / 8位生存时

11、间 ttl unsigned char proto; / 8位协议 (tcp, udp 或其他) unsigned short checksum; / 16位ip首部校验和 unsigned int sourceip; / 32位源ip地址 unsigned int destip; / 32位目的ip地址 ;/ 定义tcp首部 struct tcp ushort th_sport; / 16位源端口 ushort th_dport; / 16位目的端口 unsigned int th_seq; / 32位序列号 unsigned int th_ack; / 32位确认号 unsigned ch

12、ar th_lenres; / 4位首部长度/6位保留字 unsigned char th_flag; / 6位标志位 ushort th_win; / 16位窗口大小 ushort th_sum; / 16位校验和 ushort th_urp; / 16位紧急数据偏移量 ;void main()int sock,bytes_recieved,fromlen;char buffer65535;struct sockaddr_in from;struct ip *ip;struct tcp *tcp;word wversionrequested; /版本号wsadata wsadata; /启动

13、socket的int err;wversionrequested = makeword( 2, 2 );/建立版本err = wsastartup( wversionrequested,&wsadata );/启用socketif ( err != 0 ) /如果返回值不等于0,那么表示出错,直截退出程序return;sock=socket(af_inet,sock_raw,ipproto_ip);bool flag=true;setsockopt(sock, ipproto_ip, 2 , (char*)&flag, sizeof(flag);sockaddr_in addr

14、; addr.sin_family = af_inet; addr.sin_addr.s_un.s_addr=inet_addr("127.0.0.1"); /ip设置addr.sin_port=htons(0);if(socket_error=bind(sock,(sockaddr *)&addr,sizeof(addr) /绑定 closesocket(sock); printf("绑定失败!"); exit(0); dword dwbytesret;dword dwval=1;ioctlsocket(sock, sio_rcvall, &a

15、mp;dwval); /设置网卡为混听模式int i=0; while(true)fromlen=sizeof(from);bytes_recieved=recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)&from,&fromlen); /接收数据i+;ip=(struct ip *)buffer; /得到ip头if(ip->proto=6) /过滤其他协议,只留下tcp协议tcp=(struct tcp *)(buffer+(4*ip->h_verlen&0xf0>>4); /得到t

16、cp头printf("ip包字节数:%dn",bytes_recieved); /打印ip数据包长度printf("源ip:%sn", inet_ntoa(*(in_addr*)&ip->sourceip); /打印源ipprintf("目的ip:%sn", inet_ntoa(*(in_addr*)&ip->destip); /打印目的ipprintf("源端口:%dn",ntohs(tcp->th_sport); /打印源端口printf("目的端口:%dn",ntohs(tcp->th_dport); /打印目的端口printf("tcp的数据内容:");char* ptr=buffer+5+ 4*(tcp->th_lenres&0xf0)>>4|0); /计算数据头指针int cpysize=bytes_recieved-5- 4*(tcp->th_lenres&0xf0)>>4|0); /计算数据长度memc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论