发送及接收TCP数据包.doc
文本预览下载声明
PAGE 12
湖北工业大学
计算机网络课程设计
设计题目:发送和接收TCP数据包
班 级:XXX
姓 名:xxx
学 号:XXX
指导老师:XXX
发送和接受TCP数据包
1.设计题目与要求
1.1设计题目
发送和接收TCP数据包
1.2技术要求
本设计的功能是填充一个TCP数据包,并发送给目的主机。
1)以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port,其中SendTCP是程序名,source_ip为源端IP地址,source_port为源端口号,dest_ip为目的地址,dest_port为目的端口号。
2)其他的TCP头部参数请自行设定。
3)数据字段为“This is my homework of network,I am happy!”。
4)成功发送后在屏幕上输出“send OK”。
2.总的设计思想及系统平台、语言、工具等
2.1工作环境
软件:Microsoft Visual C++ 6.0;硬件:PC机一台。
2.2设计思想
本课程设计的目标是发送一个TCP数据包,可以利用原始套接字来完成这个工作。整个程序由初始化原始套接字和发送TCP数据包两个部分组成。
2.2.1创建一个原始套接字,并设置IP头选项 SOCKET sock; sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP); 或者: sock=WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED); 这里,我们设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型。
为使用发送接收超时设置,必须将标志位置位置为WSA_FLAG_OVERLAPPED。在本课程设计中,发送TCP包时隐藏了自己的IP地址,因此我们要自己填充IP头,设置IP头操作选项。其中flag设置为ture,并设定 IP_HDRINCL 选项,表明自己来构造IP头。注意,如果设置IP_HDRINCL 选项,那么必须具有 administrator权限,要不就必须修改注册表: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Afd\Parameter\ 修改键:DisableRawSecurity(类型为DWORD),把值修改为 1。如果没有,就添加。 BOOL Flag=TRUE; setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)Flag, sizeof(Flag));
int timeout=1000;
setsockopt(sock, SOL_SOCKET,SO_SNDTIMEO,(char*)timeout, sizeof(timeout));
在这里我们使用基本套接字SOL_SOCKET,设置SO_SNDTIMEO表示使用发送超时设置,超时时间设置为1000ms。
2.2.2构造IP头和TCP头这里, IP头和TCP头以及TCP伪部的构造请参考下面它们的数据结构。
2.2.3计算校验和的子函数
在填充数据包的过程中,需要调用计算校验和的函数checksum两次,分别用于校验IP头和TCP头部(加上伪头部),其实现代码如下:
USHORT checksum(USHORT *buffer, int size) { unsigned long cksum=0; while(size 1) { cksum+=*buffer++; size -=sizeof(USHORT); } if(size ) { cksum += *(UCHAR*)buffer; } cksum = (cksum 16) + (cksum 0xffff); cksum += (cksum 16); return (USHORT)(~cksum); }
3.数据结构与模块说明(功能与流程图)
3.1数据结构
typedef struct _iphdr //定义IP首部 { UCHAR h_lenver; //4位首部长度+4位IP版本号 UCHAR tos; //8位服务类型TOS USHORT total_len; //16位总长度(字节) USHORT ident; //16位标识 USHORT frag_and_flags; //3位标志位 UCHAR ttl; //8位生存时间 TTL
UCHAR prot
显示全部