云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > tcp数据包

tcp数据包

  • 62 次阅读
  • 3 次下载
  • 2025/6/27 12:40:44

2.发送TCP数据包

设计题目

本设计的目的是填充一个TCP数据包,并发送给目的主机。 1) 以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port Data 其中SendTCP为程序名,source_ip、source_port、dest_ip和dest_port分别为源IP地址、目的IP地址、源端口和目的端口, Data为数据字段。 2)其他的TCP头部参数请自行设定。

3)数据字段为“This is my homework of network,I am very happy!”。 4)成功发送后在屏幕上输出“send OK”。 设计思想

本课程设计的目标是发送一个TCP数据包,可以利用原始套接字来完成这个工作。整个程序由初始化原始套接字和发送TCP数据包两个部分组成。

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构造IP头和TCP头

这里, IP头和TCP头以及TCP伪部的构造请参考下面它们的数据结构。 2.3计算校验和的子函数

在填充数据包的过程中,需要调用计算校验和的函数checksum两次,分别用于校验IP头和TCP头部(加上伪头部)

1

2.4源程序

#include #include #include #include #include #include #include #include

#pragma comment(lib,\

#define IPVER 4 //IP协议预定

#define MAX_BUFF_LEN 65500 //发送缓冲区最大值

typedef struct ip_hdr //定义IP首部 {

UCHAR h_verlen; //4位首部长度,4位IP版本号 UCHAR tos; //8位服务类型TOS USHORT total_len; //16位总长度(字节) USHORT ident; //16位标识 USHORT frag_and_flags; //3位标志位

UCHAR ttl; //8位生存时间 TTL

UCHAR proto; //8位协议 (TCP, UDP 或其他) USHORT checksum; //16位IP首部校验和 ULONG sourceIP; //32位源IP地址 ULONG destIP; //32位目的IP地址 }IP_HEADER;

typedef struct tsd_hdr //定义TCP伪首部 {

ULONG saddr; //源地址 ULONG daddr; //目的地址 UCHAR mbz; //没用

UCHAR ptcl; //协议类型 USHORT tcpl; //TCP长度 }PSD_HEADER;

typedef struct tcp_hdr //定义TCP首部 {

USHORT th_sport; //16位源端口 USHORT th_dport; //16位目的端口 ULONG th_seq; //32位序列号 ULONG th_ack; //32位确认号

2

UCHAR th_lenres; //4位首部长度/6位保留字 UCHAR th_flag; //6位标志位 USHORT th_win; //16位窗口大小 USHORT th_sum; //16位校验和

USHORT th_urp; //16位紧急数据偏移量 }TCP_HEADER;

//CheckSum:计算校验和的子函数

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

int main(int argc, char* argv[]) {

WSADATA WSAData; SOCKET sock;

IP_HEADER ipHeader; TCP_HEADER tcpHeader; PSD_HEADER psdHeader;

char Sendto_Buff[MAX_BUFF_LEN]; //发送缓冲区

unsigned short check_Buff[MAX_BUFF_LEN]; //检验和缓冲区

const char tcp_send_data[]={\happy!\

BOOL flag;

int rect,nTimeOver;

if (argc!= 5)

3

{

printf(\SendTcp soruce_ip source_port dest_ip dest_port \\n\ return false; }

if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0) {

printf(\ return false; }

if((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0, WSA_FLAG_OVERLAPPED))==INVALID_SOCKET) {

printf(\ return false; }

flag=true;

if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag))==SOCKET_ERROR) {

printf(\ return false; }

nTimeOver=1000;

if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR) {

printf(\ return false; }

//填充IP首部

ipHeader.h_verlen=(IPVER<<4 | sizeof(ipHeader)/sizeof(unsigned long));

ipHeader.tos=(UCHAR)0;

ipHeader.total_len=htons((unsigned

short)sizeof(ipHeader)+sizeof(tcpHeader)+sizeof(tcp_send_data)); ipHeader.ident=0; //16位标识 ipHeader.frag_and_flags=0; //3位标志位 ipHeader.ttl=128; //8位生存时间

ipHeader.proto=IPPROTO_UDP; //协议类型 ipHeader.checksum=0; //检验和暂时为0

ipHeader.sourceIP=inet_addr(argv[1]); //32位源IP地址

4

搜索更多关于: tcp数据包 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

2.发送TCP数据包 设计题目 本设计的目的是填充一个TCP数据包,并发送给目的主机。 1) 以命令行形式运行:SendTCP source_ip source_port dest_ip dest_port Data 其中SendTCP为程序名,source_ip、source_port、dest_ip和dest_port分别为源IP地址、目的IP地址、源端口和目的端口, Data为数据字段。 2)其他的TCP头部参数请自行设定。 3)数据字段为“This is my homework of network,I am very happy!”。 4)成功发送后在屏幕上输出“send OK”。 设计思想 本课程设计的目标是发送一个TCP数据包,可以利用原始套接字来完成这个工

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com