网课是b站中科大郑烇老师,杨坚老师课程,郑烇老师账号发布的
图片均来自郑老师分享的PPT
第二章 应用层
目录
2.8TCP套接字编程
一、Socket编程
1、使用socket编程的原因
应用进程(应用层)使用传输层提供的服务才能够交换报文,实现应用协议,实现应用
2、概念
TCP/IP:应用进程使用Socket API访问传输服务
地点:界面上的SAP(Socket)
方式:Socket API
目标: 学习如何构建能借助sockets进行通信的C/S应用程序
socket: 分布式应用进程之间的门,传输层协议提供的端到端服务接口(本质是整数,TCP的socket记录了服务器的ip和端口号以及客户端的ip和端口号)
3、socket类型
2种传输层服务的socket类型
- TCP: 可靠的、字节流的服务
- UDP: 不可靠(数据UDP数据报)服务
二、TCP套接字编程
套接字:应用进程与端到端传输协议(TCP或UDP)之间
的门户
TCP服务:从一个进程向另一个进程可靠地传输字节流
2、过程
服务器首先运行,等待连接建立
1:服务器进程必须先处于运行状态
- 创建欢迎socket
- 和本地端口捆绑
- 在欢迎socket上阻塞式等待接收用户的连接
客户端主动和服务器建立连接:
2:创建客户端本地套接字(隐式捆绑到本地port)
指定服务器进程的IP地址和端口号,与服务器进程连接
3 :当与客户端连接请求到来时
-服务器接受来自用户端的请求,解除阻塞式等待,返回一个新的socket(与欢迎socket不一样),与客户端通信
这个新的socket记录了本地和服务器的ip和端口,之前那个欢迎socket只记录了服务器的ip和端口,此时他俩都在服务器那里同一个ip和端口处
新的socket在不需要连接的时候会断开,欢迎socket则一直在服务器那里等待
-允许服务器与多个客户端通信
-使用源IP和源端口来区分不同的客户端
4:连接API调用有效时,客户端P与服务器建立了TCP连接
从应用程序的角度
TCP在客户端和服务器进程之间提供了可靠的、字节流(管道)服务
3、结构体
数据结构 sockaddr_in
IP地址和port捆绑关系的数据结构(标示进程的端节点)
进程的段节点=IP地址+port端口
struct sockaddr_in {
short sin_family; //AF_INET
u_short sin_port; // port
struct in_addr sin_addr ; // IP 地址, unsigned long
char sin_zero[8]; // align(对齐)
};
数据结构 hostent
域名和IP地址的数据结构
struct hostent
{ char *h_name;
char **h_aliases;
int h_addrtype;
int h_length; /地址长度/
char **h_addr_list;
#define h_addr h_addr_list[0];
}
作为调用域名解析函数时的参数
返回后,将IP地址拷贝到 sockaddr_in的IP地址部分
2.9UDP套接字编程
一、UDP
1、UDP的特点
- 在客户端和服务器之间既没有连接 ,也没有握手
- 发送端在每一个报文中明确地指定目标的IP地址和端口号
- 服务器必须从收到的分组中提取出发送端的IP地址和端口号
- UDP: 传送的数据可能乱序,也可能丢失
2、进程视角看UDP服务
UDP 为客户端和服务器提供不可靠的字节组的传送服务