- 前言
- 一、客户端基本功能
- 1.解析服务器IP地址
- 2.解析服务器端口号
- 3.解析协议号
- 二、客户端实现
- 1.TCP客户端软件流程
- 2.UDP客户端软件流程
- 三、服务器软件设计
- 1.循环无连接(Iterative connectionless)服务器
- 2.循环面向连接(Iterative connection-oriented)服务器
- 3.并发无连接(Concurrent connectionless)服务器
- 4.并发面向连接(Concurrent connection-oriented)服务器
- 总结
提示:以下是本篇文章正文内容
一、客户端基本功能 1.解析服务器IP地址客户端可能使用域名(如:study.163.com)或IP地址(如: 123.58.180.121)标识服务器,但是, IP协议需要使用32位二进制IP地址,
(1)函数inet_addr( ) 实现点分十进制IP地址到32位IP地址转换
(2)函数gethostbyname( ) 实现域名到32位IP地址转换,返回一个指向结构hostent 的指针
hostent结构体:包含32位IP地址
struct hostent
{
char FAR* h_name; /*official host name */
char FAR* FAR* h_aliases; /*other aliases */
short h_addrtype; /*address type */
short h_lengty; /*address length */
char FAR* FAR* h_addr_list; /*list of address */
};
#define h_addr h_addr_list[0]
2.解析服务器端口号
客户端还可能使用服务名(如HTTP)标识服务器端口,需要将服务名转换为熟知端口号
通过调用函数getservbyname( ) ,返回一个指向结构servent的指针
servent结构体:包含端口号
struct servent
{
char FAR* s_name; /*official service name */
char FAR* FAR* s_aliases; /*other aliases */
short s_port; /*port for this service */
char FAR* s_proto; /*protocol to use */
};
3.解析协议号
客户端可能使用协议名(如:TCP)指定协议,需要将协议名转换为协议号(如: 6)
通过调用函数getprotobyname ( ) 实现协议名到协议号的转换,返回一个指向结构protoent的指针
protoent结构体:包含协议号
struct protoent
{
char FAR* p_name; /*official protocol name*/
char FAR* FAR* p_aliases; /*list of aliases allowed*/
short p_proto; /*official protocol number*/
};
二、客户端实现
1.TCP客户端软件流程
1.确定服务器IP地址与端口号 2.创建套接字 3.分配本地端点地址(IP地址+端口号) 4.连接服务器(套接字) 5.遵循应用层协议进行通信 6.关闭/释放连接
2.UDP客户端软件流程1.确定服务器IP地址与端口号 2.创建套接字 3.分配本地端点地址(IP地址+端口号) 4.指定服务器端点地址,构造UDP数据报 5.遵循应用层协议进行通信 6.关闭/释放套接字
三、服务器软件设计 1.循环无连接(Iterative connectionless)服务器循环这里是指一次只处理一个,处理完后,接着处理下一个
软件流程:
1.创建套接字 2.绑定端点地址(INADDR_ANY+端口号) 3.反复接收来自客户端的请求 4.遵循应用层协议,构造响应报文,发送给客户
数据发送:服务器端不能使用connect()函数,无连接服务器使用sendto()函数发送数据报 获取客户端点地址:调用recvfrom()函数接收数据时,自动提取
设计流程:
1.创建(主)套接字,并绑定熟知端口号; 2.设置(主)套接字为被动监听模式,准备用于服务器; 3.调用accept()函数接收下一个连接请求(通过主套接字),创建新套接字用于与该客户建立连接; 4.遵循应用层协议,反复接收客户请求,构造并发送响应(通过新套接字); 5.完成为特定客户服务后,关闭与该客户之间的连接,返回步骤3.
3.并发无连接(Concurrent connectionless)服务器设计流程:
主线程1: 创建套接字,并绑定熟知端口号; 主线程2: 反复调用recvfrom()函数,接收下一个客户请求,并创建新线程处理该客户响应; 子线程1: 接收一个特定请求; 子线程2: 依据应用层协议构造响应报文,并调用sendto()发送; 子线程3: 退出(一个子线程处理一个请求后即终止)。
4.并发面向连接(Concurrent connection-oriented)服务器设计流程:
主线程1: 创建(主)套接字,并绑定熟知端口号; 主线程2: 设置(主)套接字为被动监听模式,准备用于服务器; 主线程3: 反复调用accept()函数接收下一个连接请求(通过主套接字),并创建一个新的子线程处理该客户响应; 子线程1: 接收一个客户的服务请求(通过新创建的套接字); 子线程2: 遵循应用层协议与特定客户进行交互; 子线程3: 关闭/释放连接并退出(线程终止) .
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?