《原始套接字编程》课程设计报告文档格式.doc

上传人:wj 文档编号:6941446 上传时间:2023-05-07 格式:DOC 页数:8 大小:88.50KB
下载 相关 举报
《原始套接字编程》课程设计报告文档格式.doc_第1页
第1页 / 共8页
《原始套接字编程》课程设计报告文档格式.doc_第2页
第2页 / 共8页
《原始套接字编程》课程设计报告文档格式.doc_第3页
第3页 / 共8页
《原始套接字编程》课程设计报告文档格式.doc_第4页
第4页 / 共8页
《原始套接字编程》课程设计报告文档格式.doc_第5页
第5页 / 共8页
《原始套接字编程》课程设计报告文档格式.doc_第6页
第6页 / 共8页
《原始套接字编程》课程设计报告文档格式.doc_第7页
第7页 / 共8页
《原始套接字编程》课程设计报告文档格式.doc_第8页
第8页 / 共8页
亲,该文档总共8页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

《原始套接字编程》课程设计报告文档格式.doc

《《原始套接字编程》课程设计报告文档格式.doc》由会员分享,可在线阅读,更多相关《《原始套接字编程》课程设计报告文档格式.doc(8页珍藏版)》请在冰点文库上搜索。

《原始套接字编程》课程设计报告文档格式.doc

IPPROTO_IGMPINTERNET网关服务协议,在多播中用到

在AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三种套接字类型。

SOCK_STREAM也就是通常所说的TCP,而SOCK_DGRAM则是通常所说的UDP,而SOCK_RAW则是用于提供一些较低级的控制的;

第3个参数依赖于第2个参数,用于指定套接字所用的特定协议,设为0表示使用默认的协议。

RAWSOCKET能够对较低层次的协议直接访问,网络监听技术很大程度上依赖于它。

(2)能够抓取第二节课的并发服务器程序的服务器端或客户端的应用层数据,即:

时间值,打印输出。

二、设计方案

同一台主机不同进程可以用进程号来唯一标识,但是在网络环境下进程号并不能唯一标识该进程。

TCP/IP主要引入了网络地址、端口和连接等概念来解决网络间进程标识问题。

套接字(Socket)是一个指向传输提供者的句柄,TCP/IP协议支持3种类型的套接字,分别是流式套接字、数据报式套接字和原始套接字。

流式套接字(SOCKET_STREAM)提供了面向连接、双向可靠的数据流传输服务。

数据报式套接字(SOCKET_DGRAM)提供了无连接服务,不提供无错保证。

原始套接字(SOCKET_RAW)允许对较低层次的协议直接访问,比如IP、ICMP协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备,因为RAWSOCKET可以自如地控制Windows下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。

比如,我们可以通过RAWSOCKET来接收发向本机的ICMP、IGMP协议包,或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定包头或自定协议的IP包。

网络监听技术很大程度上依赖于SOCKET_RAW。

本实验采用原始套接字进行捕获通过本主机的包并对本主机的包进行处理。

u各个函数功能:

char*GetProtocol(intproto)//获得协议类型

send(CientSocket,tmp,(int)strlen(tmp),0);

发送数据

recv(CientSocket,RecvBuffer,MAX_PATH,0);

接收数据

WSAStartup(MAKEWORD(2,2),&

Ws)初始化套接字类库

socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

创建套接字

bind(ServerSocket,(structsockaddr*)&

LocalAddr,sizeof(LocalAddr));

绑定套接字

listen(ServerSocket,10);

侦听,队列大小为10

u设计思想:

采用原始套接字进行捕获通过本主机的包并对本主机的包进行处理。

三、详细设计

头文件ip.h:

详细代码:

//定义标准的的TCP头和IP头

#defineURG0x20

#defineACK0x10

#definePSH0x08

#defineRST0x04

#defineSYN0x02

#defineFIN0x01

typedefstruct_iphdr//定义IP首部

{

unsignedcharh_verlen;

//4位首部长度+4位IP版本号

unsignedchartos;

//8位服务类型TOS

unsignedshorttotal_len;

//16位总长度(字节)

unsignedshortident;

//16位标识

unsignedshortfrag_and_flags;

//3位标志位

unsignedcharttl;

//8位生存时间TTL

unsignedcharproto;

//8位协议(TCP,UDP或其他)

unsignedshortchecksum;

//16位IP首部校验和

unsignedintsourceIP;

//32位源IP地址

unsignedintdestIP;

//32位目的IP地址

}IP_HEADER;

typedefstruct_tcphdr//定义TCP首部

USHORTth_sport;

//16位源端口

USHORTth_dport;

//16位目的端口

unsignedintth_seq;

//32位序列号

unsignedintth_ack;

//32位确认号

unsignedcharth_lenres;

//4位首部长度/6位保留字

unsignedcharth_flag;

//6位标志位

USHORTth_win;

//16位窗口大小

USHORTth_sum;

//16位校验和

USHORTth_urp;

//16位紧急数据偏移量

}TCP_HEADER;

//定义ICMP首部

typedefstructicmp_hdr

unsignedchari_type;

//类型

unsignedchari_code;

//代码

unsignedshorti_cksum;

//校验码

unsignedshorti_id;

//非标准的ICMP首部

unsignedshorti_seq;

unsignedlongtimestamp;

}ICMP_HEADER;

typedefstructudp_hdr//8Bytes定义udp首部

unsignedshortuh_sport;

unsignedshortuh_dport;

unsignedshortuh_len;

unsignedshortuh_sum;

}UDP_HEADER;

源文件:

详细代码:

#include<

stdio.h>

Winsock2.h>

#pragmacomment(lib,"

ws2_32"

#defineSIO_RCVALL_WSAIOW(IOC_VENDOR,1)

structip//定义IP首部

{

unsignedcharh_verlen;

//4位首部长度,4位IP版本号

unsignedchartos;

//8位服务类型TOS

unsignedshortip_length;

//16位总长度(字节)

unsignedshortident;

//16位标识

unsignedshortfrag_and_flags;

//3位标志位

unsignedcharttl;

//8位生存时间TTL

unsignedcharproto;

//8位协议(TCP,UDP或其他)

unsignedshortchecksum;

//16位IP首部校验和

unsignedintsourceIP;

//32位源IP地址

unsignedintdestIP;

//32位目的IP地址

};

//定义TCP首部

structtcp

USHORTth_sport;

//16位源端口

USHORTth_dport;

//16位目的端口

unsignedintth_seq;

//32位序列号

unsignedintth_ack;

//32位确认号

unsignedcharth_lenres;

//4位首部长度/6位保留字

unsignedcharth_flag;

//6位标志位

USHORTth_win;

//16位窗口大小

USHORTth_sum;

//16位校验和

USHORTth_urp;

//16位紧急数据偏移量

voidmain()

intsock,bytes_recieved,fromlen;

charbuffer[65535];

structsockaddr_infrom;

structip*ip;

structtcp*tcp;

WORDwVersionRequested;

//版本号

WSADATAwsaData;

//启动SOCKET的

interr;

wVersionRequested=MAKEWORD(2,2);

//建立版本

err=WSAStartup(wVersionRequested,&

wsaData);

//启用socket

if(err!

=0)//如果返回值不等于0,那么表示出错,直截退出程序

{

return;

}

sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);

boolflag=true;

setsockopt(sock,IPPROTO_IP,2,(char*)&

flag,sizeof(flag));

sockaddr_inaddr;

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);

}

DWORDdwBytesRet;

DWORDdwVal=1;

ioctlsocket(sock,SIO_RCVALL,&

dwVal);

//设置网卡为混听模式

inti=0;

while(true)

fromlen=sizeof(from);

bytes_recieved=recvfrom(sock,buffer,sizeof(buffer),0,(structsockaddr*)&

from,&

fromlen);

//接收数据

i++;

ip=(structip*)buffer;

//得到ip头

if(ip->

proto==6)//过滤其他协议,只留下TCP协议

{

tcp=(structtcp*)(buffer+(4*ip->

h_verlen&

0xf0>

>

4));

//得到tcp头

printf("

Ip包字节数:

%d\n"

bytes_recieved);

//打印ip数据包长度

源IP:

%s\n"

inet_ntoa(*(in_addr*)&

ip->

sourceIP));

//打印源IP

目的IP:

destIP));

//打印目的IP

源端口:

ntohs(tcp->

th_sport));

//打印源端口

目的端口:

th_dport));

//打印目的端口

TCP的数据内容:

char*ptr=buffer+5+4*((tcp->

th_lenres&

0xf0)>

4|0);

//计算数据头指针

intcpysize=bytes_recieved-5-4*((tcp->

//计算数据长度

memcpy(buffer,ptr,cpysize);

//取出数据

for(inti=0;

i<

cpysize;

i++)//打印数据

{

if(buffer[i]>

=32&

&

buffer[i]<

255)

{

printf("

%c"

(unsignedchar)buffer[i]);

}

else

printf("

."

}

\n"

}

}

u运行界面:

u

四、总结与体会

掌握了利用RAWSOCKET捕获网络数据包并对其进行分析

7

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 水产渔业

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2