网络编程 TCP/UDP通信

news/2024/5/18 11:52:48 标签: 网络, tcp/ip, udp, 服务器, linux, c语言

网络编程 TCP/UDP通信

  • 1. 0.0.0.0地址与客户端bind函数
  • 2. UDP 服务器与客户端通信
  • 3. TCP 服务器与客户端通信

1. 0.0.0.0地址与客户端bind函数

  1. 0.0.0.0的地址作用
    网络编程中,0.0.0.0是一个特殊的IP地址,通常用于表示"任意地址"或"所有地址"。当服务器绑定到0.0.0.0时,表示它可以接受来自任意IP地址的连接。这对于监听多个网络接口或多个IP地址的服务器非常有用。

  2. 客户端不需要显式绑定端口
    动态分配端口: 客户端通常不关心使用哪个本地端口,因此可以让操作系统动态分配一个可用端口。通过在 socket 创建后不显式调用 bind 函数,操作系统会自动为客户端分配一个合适的本地端口。
    多连接: 如果客户端需要与多个服务器建立连接,显式绑定端口可能会引入复杂性。通过动态分配端口,可以更轻松地处理多个连接,而不必担心端口冲突。

2. UDP 服务器与客户端通信

网络编程中,UDP(User Datagram Protocol)是一种无连接、不可靠的传输协议,适用于一些实时性要求较高的场景。UDP通过数据报进行通信,不保证数据的可靠性,但通常传输速度较快。下面将介绍一个简单的UDP服务器与客户端通信的示例代码。

在这里插入图片描述

  1. UDP服务器

代码结构

udpserver 类: 该类封装了UDP服务器的相关操作,包括初始化、运行等。
构造函数: 接受端口号和IP地址作为参数,用于初始化服务器对象。
析构函数: 关闭服务器套接字。
init 函数: 初始化服务器套接字,创建UDP套接字,绑定到指定地址和端口。
run 函数服务器的运行函数,循环接收客户端消息并回复。
main 函数: 作为程序的入口,从命令行参数获取端口号,创建 UDP 服务器对象,进行初始化并运行。

程序执行流程

命令行参数检查: 主函数首先检查命令行参数,确保用户输入的命令行参数为端口号。
UDP 服务器对象创建: 根据用户输入的端口号,创建了一个 udpserver 对象。
服务器初始化init 函数中完成了服务器套接字的创建、绑定等初始化操作。
服务器运行run 函数中通过 recvfrom 接收客户端的UDP消息,并通过 sendto 发送回复

  1. UDP客户端

代码结构

main 函数: 作为程序的入口,从命令行参数获取服务器的IP地址和端口号,创建 UDP 客户端套接字,并实现消息的发送和接收。

程序执行流程

命令行参数检查: 主函数首先检查命令行参数,确保用户输入的命令行参数为服务器的IP地址和端口号。
UDP 客户端套接字创建: 使用 socket 函数创建UDP套接字,如果创建失败则输出错误信息并退出。
服务器地址配置: 创建并配置 server 结构体,用于存储服务器地址信息。
消息交互循环: 使用 sendto 发送用户输入的消息到服务器,并使用 recvfrom 接收服务器的回复消息。
消息输出: 将服务器的回复输出到标准输出。
循环迭代: 通过循环迭代,实现不断地与服务器进行消息交互。

3. TCP 服务器与客户端通信

在计算机网络编程中,TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输协议。与UDP不同,TCP提供可靠的数据传输,确保数据的完整性和有序性。下面将介绍一个简单的TCP服务器与客户端通信的示例代码。
在这里插入图片描述

  1. TCP服务器

代码结构

main 函数: 作为程序的入口,从命令行参数获取服务器的端口号,创建TCP服务器套接字,并通过多线程实现与多个客户端的并发通信。
Tcpserver 类: 封装了TCP服务器的相关操作,包括初始化、启动、处理客户端请求的服务函数等。
threadData 类: 用于传递数据给新创建的线程,存储了与客户端相关的信息。

程序执行流程

命令行参数检查: 主函数首先检查命令行参数,确保用户输入的命令行参数为服务器的端口号。
服务器对象创建: 根据用户输入的端口号创建了Tcpserver对象。
服务器初始化: 调用Tcpserver对象的init函数,创建TCP套接字并绑定端口。
服务器启动: 调用Tcpserver对象的start函数,通过循环接受客户端连接请求,并为每个连接创建一个新的线程。
线程入口函数: 使用pthread创建新的线程,每个线程运行Tcpserver类中的run静态成员函数,该函数作为线程的入口函数。
服务函数run函数调用Tcpserver类的service函数,处理与客户端的具体通信过程,包括接收客户端数据、发送回复等。

  1. TCP客户端

代码结构

main 函数: 作为程序的入口,从命令行参数获取服务器的IP地址和端口号,创建TCP客户端套接字,并通过循环不断尝试连接服务器
连接服务器: 在循环中,通过connect函数尝试连接到指定的服务器。若连接失败,则等待3秒后重新尝试连接。
用户输入与通信: 连接成功后,进入另一个循环,用户可以输入待发送的数据,程序将数据发送到服务器,并等待服务器的回复。
数据传输: 使用write函数向服务器发送数据,使用read函数读取服务器返回的数据


http://www.niftyadmin.cn/n/5389615.html

相关文章

【人脸朝向识别与分类预测】基于LVQ神经网络

课题名称:基于LVQ神经网络的人脸朝向识别分类 版本日期:2024-02-20 运行方式:直接运行GRNN0503.m文件 代码获取方式:私信博主或 企鹅号:491052175 模型描述: 采集到一组人脸朝向不同角度时的图像,图像…

Flink ML 的新特性解析与应用

摘要:本文整理自阿里巴巴算法专家赵伟波,在 Flink Forward Asia 2023 AI特征工程专场的分享。本篇内容主要分为以下四部分: Flink ML 概况在线学习的设计与应用在线推理的设计与应用特征工程算法与应用 一、Flink ML 概况 Flink ML 是 Apache…

VSCODE include错误 找不到 stdio.h

解决办法: Ctrl Shift P 打开命令面板, 键入 “Select Intellisense Configuration”(下图是因为我在写文章之前已经用过这个命令,所以这个历史记录出现在了第一行) 再选择“Use gcc.exe ”(后面的Foun…

java 里面的分布式

在Java中,开发者可以利用多种工具和框架来构建分布式系统。以下是一些在Java中常用的分布式相关的技术和框架: RMI(Remote Method Invocation):Java的RMI允许在不同的Java虚拟机上的对象之间进行远程通信。通过RMI&…

el-input 回显数据换行

el-input 回显数据换行 实现&#xff1a;换行位置用\n代替 <el-inputtype"textarea":autosize"{ minRows: 4, maxRows: 6 }"placeholder"请输入内容"v-model"content"max-length"400" > </el-input>data() {r…

[C#]winform基于opencvsharp结合pairlie算法实现低光图像增强黑暗图片变亮变清晰

【低光图像增强介绍】 在图像处理领域&#xff0c;低光图像增强是一个具有挑战性的任务。由于光线不足&#xff0c;这些图像往往呈现出低对比度、高噪声和细节丢失等问题&#xff0c;严重影响了图像的视觉效果和后续分析的准确性。因此&#xff0c;开发有效的低光图像增强方法…

chatGPT 使用随想

一年前 chatGPT 刚出的时候&#xff0c;我就火速注册试用了。 因为自己就是 AI 行业的&#xff0c;所以想看看国际上最牛的 AI 到底发展到什么程度了. 自从一年前 chatGPT 火出圈之后&#xff0c;国际上的 AI 就一直被 OpenAI 这家公司引领潮流&#xff0c;一直到现在&#x…

【Swift】NSSearchField用法和示例

1.简介 NSSearchField 是 macOS 中用于搜索的文本输入框控件&#xff0c;通常用于实现搜索功能。用户可以在 NSSearchField 中输入搜索关键字&#xff0c;然后触发搜索操作。NSSearchField 可以显示搜索图标和清除按钮&#xff0c;还可以设置占位符文本等属性。 2.常用方法 …