网络编程:(TCP、UDP、广播、组播)服务器与客户端通信流程汇总

 网络编程模型:

        C/S 模型:客户端 服务器 模型--->本次汇总为这个模型

        B/S 模型:浏览器 服务器 模型

一、TCP网络编程流程

 服务器:

(1) 创建流式套接字 -- socket ( )

(2) 填充服务器的网络信息结构体

(3) 将套接字与服务器的网络信息结构体绑定 -- bind ( )

(4) 将套接字设置成被动监听状态 -- listen ( )

(5) 阻塞等待客户端连接 -- accept ( )

(6) 数据收发 -- send ( ) / recv ( )

(7) 关闭套接字 -- close ( )

 客户端:

(1) 创建流式套接字 -- socket ( )

(2) 填充服务器的网络信息结构体

(3) 与服务器建立连接 -- connect ( )

(4) 数据收发 -- send ( ) / recv ( )

(5) 关闭套接字 -- close ( )

 二、TCP网络编程注意事项

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多路复用解决。

三、UDP网络编程流程 

服务器:

(1) 创建用户数据报套接字 -- socket ( )

(2) 填充服务器的网络信息结构体

(3) 将套接字与服务器的网络信息结构体绑定 -- bind ( )

(4) 数据收发 -- sendto ( ) / recvfrom ( )

(5) 关闭套接字 -- close ( )

客户端:

(1) 创建用户数据报套接字

(2) 填充服务器的网络信息结构体

(3) 数据收发 -- sendto ( ) / recvfrom ( )

(4) 关闭套接字 -- close ( )

四、UDP网络编程注意事项

 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 ( )

七、TCP本地通信流程

 服务器:

(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 ( )

八、UDP本地通信流程

服务器:

(1) 创建套接字 -- socket ( )

(2) 填充服务器本地信息结构体 -- sockaddr_un

(3) 将套接字与服务器本地信息结构体绑定 -- bind ( )

(4) 进行通信 recvfrom ( ) / sendto ( )

客户端: 

(1) 创建套接字 -- socket ( )

(2) 填充客户端本地信息结构体 -- sockaddr_un

(3) 将套接字与客户端本地信息结构体绑定 -- bind ( )

(4) 填充服务器本地信息结构体 -- sockaddr_un

(5) 进行通信 -- sendto ( ) / recvfrom ( )

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值