网络编程 TCP/UDP通信
- 1. 0.0.0.0地址与客户端bind函数
- 2. UDP 服务器与客户端通信
- 3. TCP 服务器与客户端通信
1. 0.0.0.0地址与客户端bind函数
-
0.0.0.0的地址作用
在网络编程中,0.0.0.0是一个特殊的IP地址,通常用于表示"任意地址"或"所有地址"。当服务器绑定到0.0.0.0时,表示它可以接受来自任意IP地址的连接。这对于监听多个网络接口或多个IP地址的服务器非常有用。 -
客户端不需要显式绑定端口
动态分配端口: 客户端通常不关心使用哪个本地端口,因此可以让操作系统动态分配一个可用端口。通过在 socket 创建后不显式调用 bind 函数,操作系统会自动为客户端分配一个合适的本地端口。
多连接: 如果客户端需要与多个服务器建立连接,显式绑定端口可能会引入复杂性。通过动态分配端口,可以更轻松地处理多个连接,而不必担心端口冲突。
2. UDP 服务器与客户端通信
在网络编程中,UDP(User Datagram Protocol)是一种无连接、不可靠的传输协议,适用于一些实时性要求较高的场景。UDP通过数据报进行通信,不保证数据的可靠性,但通常传输速度较快。下面将介绍一个简单的UDP服务器与客户端通信的示例代码。
- UDP服务器
代码结构
udpserver 类: 该类封装了UDP服务器的相关操作,包括初始化、运行等。
构造函数: 接受端口号和IP地址作为参数,用于初始化服务器对象。
析构函数: 关闭服务器套接字。
init 函数: 初始化服务器套接字,创建UDP套接字,绑定到指定地址和端口。
run 函数: 服务器的运行函数,循环接收客户端消息并回复。
main 函数: 作为程序的入口,从命令行参数获取端口号,创建 UDP 服务器对象,进行初始化并运行。
程序执行流程
命令行参数检查: 主函数首先检查命令行参数,确保用户输入的命令行参数为端口号。
UDP 服务器对象创建: 根据用户输入的端口号,创建了一个 udpserver 对象。
服务器初始化: init 函数中完成了服务器套接字的创建、绑定等初始化操作。
服务器运行: run 函数中通过 recvfrom 接收客户端的UDP消息,并通过 sendto 发送回复
- UDP客户端
代码结构
main 函数: 作为程序的入口,从命令行参数获取服务器的IP地址和端口号,创建 UDP 客户端套接字,并实现消息的发送和接收。
程序执行流程
命令行参数检查: 主函数首先检查命令行参数,确保用户输入的命令行参数为服务器的IP地址和端口号。
UDP 客户端套接字创建: 使用 socket 函数创建UDP套接字,如果创建失败则输出错误信息并退出。
服务器地址配置: 创建并配置 server 结构体,用于存储服务器地址信息。
消息交互循环: 使用 sendto 发送用户输入的消息到服务器,并使用 recvfrom 接收服务器的回复消息。
消息输出: 将服务器的回复输出到标准输出。
循环迭代: 通过循环迭代,实现不断地与服务器进行消息交互。
3. TCP 服务器与客户端通信
在计算机网络编程中,TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输协议。与UDP不同,TCP提供可靠的数据传输,确保数据的完整性和有序性。下面将介绍一个简单的TCP服务器与客户端通信的示例代码。
- TCP服务器
代码结构
main 函数: 作为程序的入口,从命令行参数获取服务器的端口号,创建TCP服务器套接字,并通过多线程实现与多个客户端的并发通信。
Tcpserver 类: 封装了TCP服务器的相关操作,包括初始化、启动、处理客户端请求的服务函数等。
threadData 类: 用于传递数据给新创建的线程,存储了与客户端相关的信息。
程序执行流程
命令行参数检查: 主函数首先检查命令行参数,确保用户输入的命令行参数为服务器的端口号。
服务器对象创建: 根据用户输入的端口号创建了Tcpserver对象。
服务器初始化: 调用Tcpserver对象的init函数,创建TCP套接字并绑定端口。
服务器启动: 调用Tcpserver对象的start函数,通过循环接受客户端连接请求,并为每个连接创建一个新的线程。
线程入口函数: 使用pthread创建新的线程,每个线程运行Tcpserver类中的run静态成员函数,该函数作为线程的入口函数。
服务函数: run函数调用Tcpserver类的service函数,处理与客户端的具体通信过程,包括接收客户端数据、发送回复等。
- TCP客户端
代码结构
main 函数: 作为程序的入口,从命令行参数获取服务器的IP地址和端口号,创建TCP客户端套接字,并通过循环不断尝试连接服务器。
连接服务器: 在循环中,通过connect函数尝试连接到指定的服务器。若连接失败,则等待3秒后重新尝试连接。
用户输入与通信: 连接成功后,进入另一个循环,用户可以输入待发送的数据,程序将数据发送到服务器,并等待服务器的回复。
数据传输: 使用write函数向服务器发送数据,使用read函数读取服务器返回的数据
。