网络编程模型:
C/S 模型:客户端 服务器 模型--->本次汇总为这个模型
B/S 模型:浏览器 服务器 模型
(1) 创建流式套接字 -- socket ( )
(2) 填充服务器的网络信息结构体
(3) 将套接字与服务器的网络信息结构体绑定 -- bind ( )
(4) 将套接字设置成被动监听状态 -- listen ( )
(5) 阻塞等待客户端连接 -- accept ( )
(6) 数据收发 -- send ( ) / recv ( )
(7) 关闭套接字 -- close ( )
(1) 创建流式套接字 -- socket ( )
(2) 填充服务器的网络信息结构体
(3) 与服务器建立连接 -- connect ( )
(4) 数据收发 -- send ( ) / recv ( )
(5) 关闭套接字 -- close ( )
1、客户端一般不需要绑定自己的网络信息结构体,因为操作系统会自动给客户端的ip地址和端口号赋值,方便用户操作。若要手动指定,只需要在客户端调用bind函数即可。
2、服务器端accept 函数的后两个参数即使设置成NULL,服务器也可以给客户端发消息。原因是,服务器不依赖于手动给定的ip地址和端口号联系客户端,而是给每个客户端都弄了一个文件描述符acceptfd,专门用于和某个客户端通信,即acceptfd 和 客户端是一 一对应的关系,所以可以通信。
3、TCP网络编程中使用 send/recv 或者 sendto / recvfrom进行通信,也可以使用read/write通信。
4、服务器端的accept 函数本质是一个阻塞的读,即是一个接收函数;客户端的connect 本质是一个写,即是一个发送函数。收发的内容本质是客户端的网络信息结构体。
5、TCP服务器本身是一个循环服务器,没法同时处理多个客户端的请求,原因是TCP服务器有两个阻塞函数( accept 、recv),两个函数之间会相互影响。可以使用多进程、多线程、IO多路复用解决。
(1) 创建用户数据报套接字 -- socket ( )
(2) 填充服务器的网络信息结构体
(3) 将套接字与服务器的网络信息结构体绑定 -- bind ( )
(4) 数据收发 -- sendto ( ) / recvfrom ( )
(5) 关闭套接字 -- close ( )
(1) 创建用户数据报套接字
(2) 填充服务器的网络信息结构体
(3) 数据收发 -- sendto ( ) / recvfrom ( )
(4) 关闭套接字 -- close ( )
1、UDP虽然是无连接的,但是也可双向的收发数据,因为UDP使用的是sendto /recvfrom 进行收发数据,sendto 相当于send 和connect 的二合一,recvfrom相当于recv 和accept的二合一。
2、UDP中客户端也可以使用connect 函数先将自己的网络信息结构体发给服务器,然后就可以使用send 和 recv 进行收发数据了。
3、如果UDP服务器端的recvfrom 的后两个参数设置成NULL,接收数据没问题,但是无法给发送方回信。因为没有保存发送方的网络信息结构体,使 sendto 函数的后两个参数没法填写。
4、UDP服务器本身是一个并发的服务器,因为只有一个阻塞函数 recvfrom。
(1) 创建套接字 -- socket ( )
(2) 设置为允许发送广播权限 -- setsockopt ( )
(3) 填充广播信息结构体 -- sockaddr_in
(4) 发送数据 -- sendto ( )
(1) 创建套接字 -- socket ( )
(2) 填充广播信息结构体 -- sockaddr_in
(3) 将套接字与广播信息结构体绑定 -- bind ( )
(4) 接收数据 -- recvfrom ( )
(1) 创建套接字 -- socket ( )
(2) 填充组播信息结构体 -- sockaddr_in
(3) 发送数据 -- sendto ( )
(1) 创建套接字 -- socket ( )
(2) 填充组播信息结构体 -- sockaddr_in
(3) 将套接字与组播信息结构体绑定 -- bind ( )
(4) 设置为加入多播组 -- setsockopt ( )
(5) 接收数据 -- recvfrom ( )
(1) 创建套接字 -- socket ( )
(2) 填充服务器本地信息结构体 -- sockaddr_un
(3) 将套接字与服务器本地结构体绑定 -- bind ( )
(4) 将套接字设置为被动监听状态 -- listen ( )
(5) 阻塞等待客户端的连接请求 -- accept ( )
(6) 进行通信 -- recv ( ) / send ( ) 或 read ( ) / write ( )
(1) 创建套接字 -- socket ( )
(2) 填充服务器本地信息结构体 -- sockaddr_un
(3) 发送客户端的连接请求 -- connect ( )
(4) 进行通信 send ( ) / recv ( )
(1) 创建套接字 -- socket ( )
(2) 填充服务器本地信息结构体 -- sockaddr_un
(3) 将套接字与服务器本地信息结构体绑定 -- bind ( )
(4) 进行通信 recvfrom ( ) / sendto ( )
(1) 创建套接字 -- socket ( )
(2) 填充客户端本地信息结构体 -- sockaddr_un
(3) 将套接字与客户端本地信息结构体绑定 -- bind ( )
(4) 填充服务器本地信息结构体 -- sockaddr_un
(5) 进行通信 -- sendto ( ) / recvfrom ( )