社区
非技术类
帖子详情
SOL_SOCKET, IPPROTO_TCP, and IPPROTO_IP. 有什么区别?
Fly2000
2002-02-28 08:13:52
谢谢回答。
...全文
661
1
打赏
收藏
SOL_SOCKET, IPPROTO_TCP, and IPPROTO_IP. 有什么区别?
谢谢回答。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
neccui
2002-02-28
打赏
举报
回复
IPPROTO_TCP 和 IPPROTO_IP 代表两种不同的协议,分别代表IP协议族里面的TCP协议和IP协议, 相应的,还有 IPPROTO_UDP
用于socket(,,,)函数
SOL_SOCKET,用于setsockopt/getsockopt 函数,表示设置(获取)socket参数
SOL应该是socket level的缩写
Windows网络编程技术_套接字选项和IO控制命令(资料+源码)
本书专门讨论Windows网络编程技术。内容包括NetBIOS和Windows重定向器方法、Winsock方法、客户端远程访问服务器方法。本书论述深入浅出、用大量实例详解了微软网络API函数的应用。 第9章 套接字选项和I/O控制命令 207 9.1 套接字选项 207 9.1.1
SOL
_
SOCKET
选项级别 208 9.1.2
SOL
_APPLETALK选项级别 215 9.1.3
SOL
_IRLMP选项级别 218 9.1.4
IP
P
ROTO
_
IP
选项级 222 9.1.5
IP
P
ROTO
_
TCP
选项级别 227 9.1.6 NSP
ROTO
_
IP
X选项级别 227 9.2 IOCTL
SOCKET
和WSAIOCTL 231 9.2.1 标准I/O控制命令 232 9.2.2 其他I/O控制命令 233 9.2.3 安全套接字层的I/O控制命令 239 9.2.4 ATM I/O控制命令 241 9.3 小结 242
计算机网络课程设计发送
TCP
数据包.doc
实验三 发送
TCP
数据包 实验目的: 设计一个发送
TCP
数据包的程序,并根据本设计说明
TCP
数据包的结构以及
TCP
协议与
IP
协议的关系,使大家对
TCP
协议的工作原理有更深入的认识。 实验要求: 本程序的功能是填充一个
TCP
数据包,并发送给目的主机。 以命令行形式运行:Send
TCP
source_
ip
source_port dest_
ip
dest_port 其中Send
TCP
为程序名;source_
ip
为源
IP
地址; source_port为源端口; dest_
ip
为目的
IP
地址; dest_port为目的端口。 其他的
TCP
头部参数自行设定。 数据字段为"This is my homework of network!". 成功发送后在屏幕上输出"send OK"。 课程设计分析: 使用原始套接字 定义
IP
头部、
TCP
头部和伪头部的数据结构 填充数据包 发送数据包 设计思想: 本课程设计的目标是发送一个
TCP
数据包,可以利用原始套接字来完成这个工作。整个程 序由初始化原始套接字和发送
TCP
数据包两个部分组成。 创建一个原始套接字,并设置
IP
头选项
SOCKET
sock; sock =
socket
(AF_INET,SOCK_RAW,
IP
P
ROTO
_
IP
); 或者: sock=WSASoccket(AF_INET,SOCK_RAW,
IP
P
ROTO
_
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,
IP
P
ROTO
_
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。 构造
IP
头和
TCP
头 这里,
IP
头和
TCP
头以及
TCP
伪部的构造请参考下面它们的数据结构。 计算校验和的子函数 在填充数据包的过程中,需要调用计算校验和的函数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); } 程序流程图: 源程序代码: #include
#include
#include
tcp
ip
.h> #include
#include
#include
#include
#include
#pragma comment(lib,"ws2_32.lib") #define
IP
VER 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
计算机网络课程设计--数据包发送和接受程序的实现.doc
《计算机网络》课程设计 题 目 数据包发送和接受程序的实现 学 院 计算机学院 2012年12月21日 数据包发送和接受程序的实现 一、设计题目与要求 1.设计题目 发送
TCP
数据包 2.设计要求 本设计的功能是填充一个
TCP
数据包,并发送给目的主机。 1)以命令行形式运行:Send
TCP
source_
ip
source_port dest_
ip
dest_port,其中Send
TCP
是程序名,source_
ip
为源端
IP
地址,source_port为源端口号 ,dest_
ip
为目的地址,dest_port为目的端口号。 2)其他的
TCP
头部参数请自行设定。 3)数据字段为"This is my homework of network,I am happy!"。 4)成功发送后在屏幕上输出"send OK"。 三、详细设计 本课程设计的目标是发送一个
TCP
数据包,可以利用原始套接字来完成这个工作。整 个程序由初始化原始套接字和发送
TCP
数据包两个部分组成。 当应用进程需要通过
TCP
发送时,它就将此应用层报文传送给执行
TCP
协议的传输实体 。
TCP
传输实体将用户数据加上
TCP
报头,形成
TCP
数据包,在
TCP
数据包上增加
IP
头部, 形成
IP
包。如图- 1显示的是
TCP
数据包和
IP
包得关系。
TCP
协议的数据传输单位称为报文段,其格式如图- 2所示。报文段报头的长度是20B~60B,选项部分长度最多为40B。
TCP
报文段主要包括以下 字段。 端口号:端口号字段包括源端口号和目的端口号。每个端口号的长度是16位,分别表 示发送该
TCP
包的应用进程的端口号和接收该
TCP
包的应用进程的端口号。 图-1
TCP
数据包加上
IP
报头形成
IP
包 序号:长度为32位。由于
TCP
协议是面向数据流的,它所传送的报文段可以视为连续 的数据流,因此需要给每一字节编号。序号字段的"序号"指的是本报文段数据的第一个 字节的序号。 确认号:该字段的长度为32位,它表示接收端希望接收下一个
TCP
包的第一个字节的 序号。 报文长度:该字段长度为4位。
TCP
报文长度是以4B为一个单元来计算的,实际上报文 长度在20B~60B之间。因此这个字段的值在5~15之间。 图-2
TCP
数据包头部的格式 保留:长度为6位,留做今后使用,目前全部置0. 控制:这个字段定义了6种不同的标志,每一个标志占一位,在同一时间可以设置一 位或多位。URG位为1时,表明应尽快把数据传送给应用程序,否则表明允许数据在缓存 中存放一段时间。RST位为1时,表明要强制切断连接。SYN位为1时,表明有确立连接的 请求,这时,把序号字段的初始值作为序号字段的值,以便开始通信。FIN位为1时,表 明发送放已经没有数据发送了。 窗口大小:长度为16位,指向必须紧急处理的数据的位置,因此最多能够传送的数据 为65535B。 紧急指针:该字段长度为16,指向必需紧急处理的位置,只有当标志URG=1时紧急指 针才生效。从
TCP
报头后面的报文数据开始,到紧急指针所指出长度的数据,就是必须紧 急处理的数据。 选项: 该字段可以多达40B,包括单字节选项和多字节选项。 校验和:该字段长度为16位,校验和的校验范围包括伪头部,
TCP
报头以及应用层来 的数据。其计算方法与
IP
协议头部校验和的计算方法一样。伪头部为12B,它本身并不是
TCP
数据包的真头部,只是在计算校验和时,临时和
TCP
数据包连接在一起。伪头部的格 式如图-3所示 0 8 16 24 31 "源
IP
地址 " "目的
IP
地址 " "00000000 "协议号(6) "
TCP
长度 " 创建一个原始套接字,并设置
IP
头选项
SOCKET
sock; sock =
socket
(AF_INET,SOCK_RAW,
IP
P
ROTO
_
IP
); 或者: sock=WSASoccket(AF_INET,SOCK_RAW,
IP
P
ROTO
_
IP
,NULL,0,WSA_FLAG_OVERLAPPED); 这里,设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型。 为使用发送接收超时设置,必须将标志位置位置为WSA_FLAG_OVERLAPPED。在本课程设计 中,发送
TCP
包时隐藏了自己的
IP
地址,因此我们要自己填充
IP
头,设置
IP
头操作选项。 其中flag设置为ture,并设定
IP
_HDRINCL 选项,表明自己来构造
IP
头。 setsockopt(sock,
IP
P
ROTO
_
IP
,
IP
_HDRINCL, (char *)&Flag, sizeof(Flag)); int timeout=1000; setsockopt(sock,
SOL
_
SOCKET
,SO_SNDTIMEO,(char*)&timeout, sizeof(timeout)); 在这里我们
搬运:
SOCKET
的level取值(
SOL
_
SOCKET
、
IP
P
ROTO
_
IP
)
点击中转:level取值说明 The level argument specifies the p
roto
col level at which the option resides. To retrieve options at the
socket
level, specify the level argument as
SOL
_
SOCKET
. To retrieve options at other levels, supply the appropriate p
roto
col number for
SOL
_
SOCKET
、
IP
P
ROTO
_
IP
、
IP
P
ROTO
_
TCP
和NSP
ROTO
_
IP
X选项级别
Normal 0 7.8 pt 0 2 false false false EN-US ZH-CN X-NONE
非技术类
1,649
社区成员
58,980
社区内容
发帖
与我相关
我的任务
非技术类
VC/MFC 非技术类
复制链接
扫一扫
分享
社区描述
VC/MFC 非技术类
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章