武汉理工大学《操作系统》课程设计说明书
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_OV
ERLAPPED);
这里,我们设置了 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 伪部的构造请参考下面它们的数据结构。