*/
#include
#pragma comment (libz nws2_3211) void getcurtime(char* curtime) {
tm;//time?h
time(&tm);//time?h sprintf (curtime, 11 %s\\nH z ctime (&tm)); )
int main()
{
int iResult;
WORD wVersionRequested; WSADATA wsaData;
SOCKET serversocket; struct sockaddr_in service; char on = 1; char msg[256];
serverSocket = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(serverSocket z SOL_SOCKETf S 0_BROAD CAST, &on, sizeof
(on) ) ; //允许发广播包
service.sin_family = AF_INET; service.sin_port = htons (9999);
service?sin_addr?s_addr = inet_addr(”226?6?6?6\
printf ( ”每3秒向组226 ? 6.6.6发包,告之本机的时间\\n” );
while (1) {
getcurtime(msg);
sendto(serverSocket, msg, strlen(msg)r 0A (sockaddr
*)&serverSocket, sizeof (serverSocket));
printf(H%s\\nu,msg);
Sleep (3000);/* sleep 3 seconds between send */
} closesocket(serverSocket); WSACleanup(); return 0; }
3?协议分析
3?1? IP数据报头部最大/小长度、头部选项最大/小长度,最多记录路由个数
头部最小长度:20 Bytes 头部最大长度:60 Bytes 选项最小t度:0 Bytes 选项最小长度:40 Bytes 最多记录路由:9个
3?2? 程序设计步骤:MyPing
(源主机发送类型为8代码为0的“回送请求报文”,当目标主机收到该报文时,将标 识符、序号、数据区复制以组成类型为0代码为0的“冋送应答报文”,发送给源主机。)
1) 创建原始套接字;
2) 设置套接字的超时选项(如6秒);
3) 构造ICMP数据报:类型为8代码为0回送请求;
4) 构造TP数据报,将上述的ICMP数据报作为IP数据报的数据部分;设置超时选 项; 5) 发送IP数据报到目标IP地址、端口;
6)若收到目标主机的类型为0代码为0的回头应答报文,则表示目标地址、端口号 可达;
3?3? 程序设计步骤:路由MTU发现
1) 创建原始套接字(ICMP协议); 2) 打开选项; 3) 构造IP报文:
4) 填写头部:报文头部长度设置为最大,不允许分片; 5) 填写数据:TCP数据报;
当路由器发现报文长度太长,需要分片,但报文头部设置为不允许分片,则路由器丢弃 该报文,并发送ICMP报文给源主机;本地收到ICMP报文后,将报文长度设置为收到的 ICMP报文长度,再次重新发送IP数据报。直到源主机收到来自目的主机的TCP确认报文, 最后一次发送的报文长度就是该路径的MTUo
3?4? 程序设计步骤:记录两主机之间经过的路由
1) 创建原始套接字;
2) 打开记录路由选项:选项类为0;选项号为7;选项长度为39;指针初值为4;
初始时,指针指向存放第一个工P地址的位置,经过各路由器时,存入每个路由器的IP 地址,指针的值每次加4;最多可存放9个IP地址;
3?5? 程序设计步骤:FTP断点续传
1) USER用户名 2) PASS 口令
3) TYPE I (文件类型:二进制) 4) FILE F (文件的数据结构:文件结构) 5) MODE S (文件的传输方式:流) 6) PORT IP端口号(客户端:EP、端口号) 7) REST N (N:己下载的字节数) 8) RETR文件名 9) QUIT (退出)
3?6? 程序设计步骤:FTP多线程下载
1) 创建N个线程,通过“SIZE文件名”获収文件大小M; 2) 每个线程历经3?5中的1)-6)步; 3) 第 i 个线程:REST I*M/N; 4) RETR文件名; 5) QUIT
3?7?FTP主动、被动方式的区别及适用的场合
FTP数据连接有两种方式:主动方式和被动方式;
主动和被动是就服务器而言的;
主动方式:服务器主动向客户端发起连接,客户端使用PORT命令将本地的IP地址和 端口号告诉服务器,服务器使用20端口连接客户端的端口;
被动方式:服务器等待客户端的连接,客户端使用PASV命令使服务器处于被动传输模 式,服务器使用PORT命令将服务器的端口(大于1024的非特权端口)告诉客户端,客户 端向服务器发起连接;
主动模式适用场合:服务器在子网内;
被动模式适用场合:客户端在子网内;客户端的防火墙可能会阻塞某些非特权端口,导 致服务器无法主动连接客户端:
3?8? 程序设计步骤:HTTP断点续传
1) 确定已下载数量n; 2) get方法头部:
range : bytes=n-(从n处开始下载)
3?9? 程序设计步骤:HTTP文件多线程下载
通过HTTP协议的head方法,提取cont ent-length内容,获取文件的大小M; 将文件分成n份,每个线程都向服务器提出文件下载请求,第i个线程的get方法头 nP
Range: bytes=(i-1)*M/N - i * M/N;
3?10? HTTP状态管理方法
HTTP是无状态的。若要对购物车进行状态管理,方法有:
1) 通过get方法,传递参数 2) 利用表单中的隐藏域 3) session 4) cookie
4?扩展
4?1?TCP连接池的设计方法
定义连接池的大小N;
创建一个大小为N的TCP套接字数组,每个套接字绑定到本地IP和端口号; 创建一个标记数组,大小为N,分别标记对应的套接字是否空闲;
当有新的连接请求时,在套接字数组中取出一个空闲的套接字,进行连接,并将该套接 字的状态改为“正在使用”;
当有连接结束时,释放该连接,并将对应的状态改为“空闲”;
4?2? 服务器端程序如何判断客户端程序是否在线
客户端按照一定的时间间隔向服务器发送心跳包,以通知服务器自己是在线的。若服务 器在间隔一定的时间(如5分钟)后,没有收到心跳包,则认为该客户端不在线,服务器 进行相
应的数据保存及资源释放处理。
5?其他