复习重点:
TCP/IP 基础: 分层模型、IP 地址特点、应用层主要协议;
网络编程基础:预留常用端口号、TCP 与 UDP 的主要特点及各自编程主要步骤、应用层
的唯一标识、IO 模型、MFC 对 Windows Sockets 封装类、WinInet API 的封装类功能;
ARP:主要步骤、主要概念、主要函数及功能
客户机/服务器模式编程:客户端/服务器端编程主要步骤、主要概念
FTP:主要交互命令、请求流程
HTTP:客户端请求主要命令、http 请求流程
电子邮件:客户端主要命令、标准信头、发生接收主要步骤
编程分析:tcp 编程客户机/服务器基本编程、udp 基本编程。
TCP 和 UDP 特点及各自编程步骤
TCP 特点:
(1) TCP 是面向连接的运输层协议。
(2) 每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对
一)。
(3) TCP 提供可靠交付的服务。
(4) TCP 提供全双工通信。
(5) 面向字节流。
(6) TCP 不保证最小传输速率,TCP 不允许发送进程以设想的速率发送数据
(7) TCP 不提供任何延时保障
UDP 特点:
(1) UDP 是无连接的,即发送数据之前不需要建立连接。
(2) UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。
(3) UDP 是面向报文的。UDP 没有拥塞控制,很适合多媒体通信的要求。
(4) UDP 支持一对一、一对多、多对一和多对多的交互通信。
(5) UDP 的首部开销小,只有 8 个字节。
(6) UDP 也不提供延时保障
编程步骤:
TCP 编程
UDP 编程
2.客户/服务器端编程主要步骤:
3.电子邮件
STMP 指令
QUIT:终止会话
HELP:请求 SMTP 命令的帮助
NOOP:空操作
VRFY:验证地址(不要求一定启用)
EXPN:扩展一个别名
HELO:客户机问候服务器
MAIL:指定邮件的发送者
RCPT:指定邮件的接收者
DATA:发送邮件的数据状态
REST:复位会话状态
SEND:指定要发送到用户终端的邮件的发送者
SOML:Send 或 Mail
SAML:Send 和 Mail
TURN:交换客户机/服务器角色
标准信头:
信头的一般格式
信头由若干信头字段(header field)组成。
所有的信头字段包括:字段名,可选的空格,冒号“:”,可选的注解空格和可选的字段体,最
后以回车换行符(CRLF)终止。即
信头字段 = 字段名:字段体
结构化字段和非结构化字段
信头字段大体可以分为结构化字段和非结构化字段两种。
结构化字段有特定的格式,由语法分析程序检测。
非结构化的字段含有任意的数据,没有固定格式。
信头字段的元素
尽管 Email 信件的总体结构非常简单,但一些信头字段的结构是很复杂的。下面介绍一些大多
数字段共有的元素。
(1)空白符
(2)注解
(3)字段折叠
(4)字段大小写
信头中必须要有的字段
在创建信件时,必须使用 Date 或 Resent-Date 字段指定创建信件的日期,必须使用 From 字段
指定创建该信件的人或程序的信箱,必须至少使用 TO、CC 或 Bcc 中的一个,或者与它们等效
的 Resent-TO,Resent-CC,Resent-Bcc 中的一个,来指定接收信件的人。
除了这些创建信件时要求的信头以外,每个处理信件的邮件传输代理(MTA)必须在它处理
的信件头部开始处加一个 Received 字段,就好像打了一个中转邮戳,这就是我们通常在许多信
件的开始看到许多个 Received 字段的原因。
发送电子邮件的一般步骤
1. 打开邮件发送的对话;
2. 指定发送者的邮箱;
3. 指定接收者的邮箱;
4. 发送邮件的内容;
5. 结束邮件发送对话。
接收电子邮件的一般步骤
首先利用 Winsock 连接上 POP3 服务器,然后:
1.使用 USER 命令发送用户信箱名。
2.使用 PASS 命令发送信箱密码。如果密码和信箱不匹配,必须从上一步骤重新开始。
3.对信箱邮件进行操作。
此阶段称为事务状态,在这一个阶段,有许多 POP3 命令可以使用,大体分为下面几类:
(1)取得信箱及邮件状态的命令
Stat:取得信箱大小信息
List:取得邮件大小信息
Uidl:取得邮件的唯一标识符。
(2)取得邮件内容的命令
Retr:从服务器取回邮件
TOP: 取邮件信头和信体的前 N 行。
(3)对邮件进行操作的命令
Dele:为邮件做删除标记。
Rset:复位 POP 会话。
4.接收邮件完毕,发送 QUIT 命令,结束 POP3 对话。
4.预留的常用端口号。
TCP
6
POP3
110
UDP
17
ONS
58
FTP
21
SNMP
161
SMTP
25
RPC
135
5.应用层的唯一标识?
套接字(IP 地址+端口号)
TFTP
69
HTTP
80
6.IO 模型
①Select(选择)
②WSAAsyncSelect(异步选择)
③WSAEventSelect(事件选择)
④Overlapped(重叠)
⑤Completion port(完成端口)
注:Windows 套接字在两种模式下执行 I/O 操作,及阻塞模式和非阻塞模式。
7.MFC 对 Windows Socket 封装的类有哪些?
CAsyncSocket 类和 CSocket 类
8.WinInet API 的封装类功能。
①使用 HTTP 协议将 HTML 页面从服务器下载到浏览器中。
②发送 FTP 请求进行上传或下载文件,或获取目录列表。
③使用 Gopher 菜单系统获取网络资源。
4 使用 Gopher、FTP、HTTP 协议建立于服务器的 连接,向服务器发送请求以及断开与服务
器之间的连接。
9.HTTP:客户端请求的主要命令和 HTTP 的请求流程
9.1 客户端请求的主要命令
①GET:请求获取 Request-URI 所标识的资源。
②POST:在 Request-URI 所标识的资源后附加新的数据。
③HEAD:请求获取由 Request-URI 所标识的资源的响应消息报头。
④PUT:请求服务器存储一个资源,并用 Request-URI 作为其标识。
⑤Delete:请求服务器删除 Request-URI 所标识的资源。
⑥TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断。
⑦CONNECT:保留将来使用。
⑧OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求。
9.2HTTP 的请求流程
HTTP 协议属于 TCP/IP 网络模型中的应用层的协议,两个应用程序(这里指浏览器和服务器)
之间要相互通信,首先得建立 TCP 连接,然后浏览器才能向服务器发送请求信息。而服务器在
收到请求信息后,将返回相应的应答信息给浏览器。浏览器接收到来自服务器的应答信息后,
对这些数据进行解释执行。
#include
#include
#include
#pragma comment(lib,"WS2_32.lib")
int main()
{
WSADATA data;
WORD w=MAKEWORD(2,0);
char sztext[]="欢迎你\r\n";
::WSAStartup(w,&data);
SOCKET s;
s=::socket(AF_INET,SOCK_DGRAM,0);
sockaddr_in addr,addr2;
int n=sizeof(addr2);
char buff[11]={0};
addr.sin_family=AF_INET;
addr.sin_port=htons(75);
addr.sin_addr.S_un.S_addr=INADDR_ANY;
::bind(s,(sockaddr*)&addr,sizeof(addr));
printf("UDP 服务器已经启动\r\n");
while(1)
{
if(::recvfrom(s,buff,11,0,(sockaddr*)&addr2,&n)!=0)
{
printf("%s 已经连接上\r\n",inet_ntoa(addr2.sin_addr));
printf("%s\r\n",buff);
::sendto(s,sztext,sizeof(sztext),0,(sockaddr*)&addr2,n);
break;
//如果有输入则关闭程序
//正常结束程序
}
else
{
}
::Sleep(100);
}
}
::closesocket(s);
::WSACleanup();
if(getchar())
{
return 0;
}
#include
#include
#include
#pragma comment(lib,"WS2_32.lib")
int main()
{
WSADATA data;
WORD w=MAKEWORD(2,0);
char sztext[]="服务器,你好!\r\n";
::WSAStartup(w,&data);
SOCKET s;
s=::socket(AF_INET,SOCK_DGRAM,0);
sockaddr_in addr,addr2;
int n=sizeof(addr2);
char buff[10]={0};
addr.sin_family=AF_INET;
addr.sin_port=htons(75);
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
printf("UDP 客户端已经启动\r\n");
if(::sendto(s,sztext,sizeof(sztext),0,(sockaddr*)&addr,n)!=0)
{
::recvfrom(s,buff,10,0,(sockaddr*)&addr2,&n);
printf("服务器说:%s\r\n",buff);
::closesocket(s);
::WSACleanup();
}
if(getchar())
{
return 0;
//如果有输入则关闭程序
//正常结束程序
}
else
{
}
}
::Sleep(100);
试卷答案
1. 流套接字提供:双向的,有序的,无重复的并且无记录的数据流服务,它适合于处理大
量数据传输。
2. 流套接字编程模型主要步骤有:
1 服务进程创建套接字
2 将本地地址绑定在所创建的套接字上以便在网络上标识该套接字
3 将套接字置入监听模式并准备接受连接请求
4 客户进程调用 socket 函数创建客户端套接字
5 客户向服务器发出连接请求
3. WinInet 是对 WinInet API 的封装,具有以下功能:
①使用 HTTP 协议将 HTML 页面从服务器下载到浏览器中
②发送 FTP 请求进行上传或下载文件,或获取目录列表
③使用 Gopher 菜单系统获取网络资源
④使用 Gopher,FTP,HTTP 协议建立于服务器的连接,向服务器发送请求以及断开与服务
器之间的连接
4.MFC 提供了两个 Windows Sockets 封装类,即:CAsyncSocket 类和 CSocket 类
.
5. 信头中必须要有的字段
在创建信件时,必须使用 Date 或 Resent-Date 字段指定创建信件的日期,必须使用 From 字段
指定创建该信件的人或程序的信箱,必须至少使用 TO、CC 或 Bcc 中的一个,或者与它们等效的
Resent-TO,Resent-CC,Resent-Bcc 中的一个,来指定接收信件的人。
发送电子邮件的一般步骤
6. 打开邮件发送的对话;
7. 指定发送者的邮箱;
8. 指定接收者的邮箱;
9. 发送邮件的内容;
10.
结束邮件发送对话。
接收电子邮件的一般步骤
首先利用 Winsock 连接上 POP3 服务器,然后:
1.使用 USER 命令发送用户信箱名。
2.使用 PASS 命令发送信箱密码。如果密码和信箱不匹配,必须从上一步骤重新开始。
3.对信箱邮件进行操作。
客户端请求的主要命令
①GET:请求获取 Request-URI 所标识的资源。
②POST:在 Request-URI 所标识的资源后附加新的数据。
③HEAD:请求获取由 Request-URI 所标识的资源的响应消息报头。
④PUT:请求服务器存储一个资源,并用 Request-URI 作为其标识。
⑤Delete:请求服务器删除 Request-URI 所标识的资源。
⑥TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断。
⑦CONNECT:保留将来使用。
⑧OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求。
HTTP 的请求流程
HTTP 协议属于 TCP/IP 网络模型中的应用层的协议,两个应用程序(这里指浏览器和服务器)
之间要相互通信,首先得建立 TCP 连接,然后浏览器才能向服务器发送请求信息。而服务器在
收到请求信息后,将返回相应的应答信息给浏览器。浏览器接收到来自服务器的应答信息后,
对这些数据进行解释执行。
Windows Socket 编程
一·设计一个基本网络服务器的步骤
1、初始化 Windows Socket
2、创建一个监听的 Socket
3、设置服务器地址信息,并将监听端口绑定到这个地址上
4、开始监听
5、接受客户端连接
6、和客户端通信
7、结束服务并清理 Windows Socket 和相关数据,或者返回第 4 步
winsock 启动与终止
由于 winsock 的服务是以动态链接库 winsock.dll 的形式实现的,所以必须先调用 WSAStartup 函
数对 winsock 进行初始化,
WSAStartup 函数的原型如下:
int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);
wVersionRequested 用于指定准备加载的动态链接库版本,通常高位字节指定的副版本,低位字
节指定主版本,然后用 MAKEWORD(X,Y)获得 wVersionRequested 的正确值,lpWSAData 是指向
WSADATA 的指针,该结构包含了加载版本库的信息,该结构如下:
typedef struct WSAData {
WORD
WORD
char
char
unsigned short
unsigned short
char FAR *
wVersion;//打算使用的 winsock 的版本
wHighVersion;//现在使用的 winsock 的最高版本
szDescription[WSADESCRIPTION_LEN+1];
szSystemStatus[WSASYS_STATUS_LEN+1];
iMaxSockets;//可同时打开的套接字数,一般不用
iMaxUdpDg;//数据报的最大长度,一般不用
lpVendorInfo;//为 winsock 实施方案有关的指定厂商信息预留的,任何
一个 win32 平台都不使用这个字段
} WSADATA, *LPWSADATA;
在关闭套接字 winsock 后,使用 WSAClenup 终止对 winsock.dll 的使用,并释放资源
WSAClenup 函数原型如下:
int WSACleanup(void);
/*************************************************/
,