Linux网络编程【UDP】

2023-05-16

文章目录

      • UDP-C/S 通信
      • TCP和UDP对
      • C/S 通信
        • 相关函数
        • recvfrom。 ( accept + read )
        • sendto。( connect + write )
        • bind()
      • UDP 服务代码参考
      • UDP客户端代码参考

UDP-C/S 通信

udp服务器,默认支持多个 客户端并行访问。因为,不需要连接。直接使用 IP+port 对应传输数据。

TCP和UDP对

tcoudp
特征面向连接的可靠的数据包传输无连接的不可靠的报文传递。
优点速度、顺序、数据量可靠。利用回执,丢包重传保证数据包到达,传输稳定。速度快,开销小。
缺点速度慢、开销大。不可靠。速度、顺序、数据流量。没有丢包重传机制。
应用场景对数据稳定性要求较高场合。如:大文件传输。对数据传输效率要求较高场合。简单网络环境(局域网)

C/S 通信

相关函数

recvfrom。 ( accept + read )

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);

	sockfd: socket()返回值,用于数据通信的套接字。
	buf:存数据的缓冲区
	len:缓冲区大小。
	flags:0
	src_addr:传出。 对端的地址结构(IP+port)。
	addrlen:传入传出。src_addr 大小。
	
	返回值:实际读到字节数。

sendto。( connect + write )

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);

	sockfd: socket()返回值,用于数据通信的套接字。
	buf:存数据的缓冲区
	len:缓冲区中实际数据的大小。
	flags:0
	src_addr:传入。 目标端的地址结构(IP+port)。
	addrlen:src_addr大小。
	
	返回值:实际写出的字节数。

bind()

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *addr,
         socklen_t addrlen);
功能:
	将本地协议地址与 sockfd 绑定,这样 ip、port 就固定了
参数:
	sockfd:socket 套接字
	addr: 指向特定协议的地址结构指针
	addrlen:该地址结构的长度
返回值:
	成功:返回 0
	失败:-1

cfd = socket(AF_INET,SOCK_DGRAM, 0)
绑定地址结构bind()
Accept()
recvfrom() 读。 /注意 recv()和send() 只能用于tcp/
数据处理
sendto()写。

UDP 服务代码参考

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define SERV_PORT 10086

int main(void)
{
	int cfd;
	cfd = socket(AF_INET, SOCK_DGRAM, 0);

	char buf[1024], clie_IP[BUFSIZ];
	int ret, i;

	struct sockaddr_in serv_addr, clie_addr;
	socklen_t clie_addr_len;

	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons(SERV_PORT);
	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

	bind(cfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));

	clie_addr_len = sizeof(clie_addr);

	while (1) {
		// 使用 recvfrom 读取客户端数据,同时获取客户端地质结构
		ret = recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr *)&clie_addr, &clie_addr_len);
		printf("client 's IP:%s    port:%d\n", 
				inet_ntop(AF_INET, &clie_addr.sin_addr.s_addr, clie_IP, sizeof(clie_IP)), 
				ntohs(clie_addr.sin_port));

		for (i = 0; i < ret; i++)
			buf[i] = toupper(buf[i]);

		sendto(cfd, buf, ret, 0, (struct sockaddr *)&clie_addr, clie_addr_len);
	}

	close(cfd);

	return 0;
}


UDP客户端代码参考

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define SERV_PORT 10086
#define SERV_IP "127.0.0.1"

int main(void)
{
    int cfd;
    cfd = socket(AF_INET, SOCK_DGRAM, 0);

    char buf[BUFSIZ];
    int ret;

    struct sockaddr_in serv_addr;

    bzero(&serv_addr, sizeof(serv_addr));  //memset();
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(SERV_PORT);
    inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr);

    while (1) {
        fgets(buf, sizeof(buf), stdin);

        sendto(cfd, buf, strlen(buf), 0, (struct sockaddr *)&serv_addr, sizeof(serv_addr));

        ret = recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);
        write(STDOUT_FILENO, buf, ret);
    }

    close(cfd);

    return 0;
}



UDP客户端注意事项:

1)本地IP、本地端口(我是谁)

2)目的IP、目的端口(发给谁)

3)在客户端的代码中,我们只设置了目的IP、目的端口

4)客户端的本地 ip、本地 port 是我们调用 sendto 的时候 linux 系统底层自动给客户端分配的;分配端口的方式为随机分配,即每次运行系统给的 port 不一样。

更多参考https://blog.csdn.net/dengjin20104042056/article/details/103018920

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux网络编程【UDP】 的相关文章

  • java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

    目录 前言1 学习路线2 学习方法 前言 这篇文章主要总结我之前所学过的框架以及学习路线 从实打实的零基础到框架再到项目 之后实习工作 也在这篇博客中记录我的学习笔记 以及在笔记中遇到的配置安装 代码bug等错误 都从零开始摸索并且记录了下
  • Java抽象类和接口的详细区别(全)

    目录 前言1 抽象类2 接口3 两者结合4 面试总结 前言 这两者经常在笔试以及面试中经常问及 xff0c 甚至在项目实战中还在纠结用哪一种类型 今天就此问题详细剖析一下 以往我的文章中也有稍微提及 xff1a java框架零基础从入门到精
  • Python 通过ImageDraw.rectangle 画矩形框

    目录 1 函数讲解2 示例代码3 补充cv2 rectangle 1 函数讲解 源代码如下 xff1a ImageDraw rectangle xy fill 61 None outline 61 None width 61 1 主要的参数
  • 基于迁移深度学习的遥感图像场景分类

    前述 根据语义特征对遥感图像场景进行分类是一项具有挑战性的任务 因为遥感图像场景的类内变化较大 xff0c 而类间变化有时却较小 不同的物体会以不同的尺度和方向出现在同一类场景中 xff0c 而同样的物体也可能出现在不同的场景里 理论上 x
  • reStructuredText文档图片表格等自动编号以及名称修改

    number figures 61 True numfig 61 True numfig secnum depth 61 1 numfig format 61 39 figure 39 39 图 s 39 39 code block 39
  • Robocup 2D仿真足球机器人环境搭建(Ubuntu 16.04)

    现在很多高校的学生都在搞RoboCup2D仿真足球机器人 xff0c 而平台的搭建便是一大问题 本人也在搭建环境中遇到各种奇奇怪怪的问题 xff0c 有些找了许多网页 xff0c 下面是我对环境搭建 中遇到的问题以及解决方法的总结 希望能帮
  • Robocup 2D仿真足球机器人环境搭建快速搭建

    虽然之前已经写了Robocup 2D仿真足球机器人环境搭建 xff0c 但是后面我找到了更快搭建环境的方法 而且现在很多团队都是在agent底层代码的基础上编写的 之前的方法配置的环境运行agent球队代码会出现错误 通过找资料得知是有些软
  • Robocup 2D新手导读(入门总结)

    目前 xff0c 我们团队接触Robocup 2D比赛也有好几个月了 xff0c 不得不说 这个比赛也有一定难度 尤其是对于第一次接触这个比赛的我们来 说 下面是我的一些总结 xff0c 希望能够帮助你们 1 Robocup 2D的比赛基本
  • Robocup 2D比赛代码导读(agent底层代码指导)

    相信刚开始接触Robocup 2D比赛的萌新 xff0c 都清楚agent的代码看起来是很痛苦的 xff0c 而且不知道从何看起 我个人观点看代码先看bhv和role这部分的代码 bhv行为动作的类的代码涉及到球员的进攻 跑位 防守 铲球等
  • python爬虫接单-资料总结

    相信看到我这篇文章的朋友们 xff0c 都是奔着赚钱来的 当初我也是冲着爬虫接单 可以赚钱 xff0c 一下就报了个将近3000元的爬虫班 python爬虫确实可以接单赚钱 后来学会了之后就迫不及待地加入了接单行列 也确实赚了一些 希望这篇
  • 爬虫Scrapy框架的介绍与使用

    Scrapy Scrapy介绍 爬取网站数据 xff0c 提取结构数据而编写的爬虫应用框架 Scrapy工作流程图 Scrapy命令 span class token number 1 span 创建Scrapy项目 scrapy star
  • 太难为我了,为了这份P7岗offer,我承受了7轮面试

    前言 今年的大环境非常差 xff0c 互联网企业裁员的现象比往年更严重了 xff0c 可今年刚好是我的第一个 五年计划 截止的时间点 xff0c 说什么也不能够耽搁了 xff0c 所以早早准备的跳槽也在疫情好转之后开始进行了 但是 xff0
  • 云计算与大数据概论第五周

    对于 大数据 xff08 Big data xff09 研究机构Gartner给出了这样的定义 大数据 是需要新处理模式才能具有更强的决策力 洞察发现力和流程优化能力来适应海量 高增长率和多样化的信息资产 麦肯锡全球研究所给出的定义是 xf
  • 【hadoop_读写流程】

    14 hadoop 补充 xff1a 解决 linux 网卡丢失问题 xff1a service NetworkManager stop chkconfig NetworkManager off 重启网络 systemctl restart
  • 半监督学习

    半监督学习 xff1a 在训练阶段结合了大量未标记的数据和少量标签数据 与使用所有标签数据的模型相比 xff0c 使用训练集的训练模型在训练时更为准确 xff0c 而且训练成本更低 如何综合利用已标签例子和未标签例子 xff0c 是半监督学
  • [控制原理基础]浅谈PID算法

    一 PID使用背景 当今的自动控制技术都是基于反馈的概念 即一个In Loop闭环的理论 xff0c 反馈理论的要素包括三个部分 xff1a 测量 比较和执行 测量关心的变量 xff0c 与期望值相比较 xff0c 用这个误差纠正调节控制系
  • 解决Github下载慢的问题!

    从GitHub上下载文件对于国内的我们简直太痛苦了 xff0c 下载了半天稳定在了8kb s 于是我开始寻找解决的方法 xff0c 最开是的方法是去查github com网站的IP xff0c 然后将IP添加到hosts文件里 xff0c
  • [Pix:地面站Mission Planner常见故障和处理方法]

    连接飞控的MP软件以后 xff0c 观察飞行数据界面 xff08 简称HUD xff09 以下为常见错误 xff1a RC not calibrated 未校正遥控器 xff0c 需要校正遥控器Compass not calibrated
  • Pixhawk指示灯的含义

    飞控的指示灯含义 xff1a 红灯与蓝灯交替闪烁 xff1a 系统初始化蓝灯闪烁 xff1a 飞控锁定状态 xff0c GPS正在搜星状态 黄灯连闪两次 xff1a 系统拒绝解锁 xff0c 提示错误 绿灯闪烁 xff1a 飞控锁定状态 x
  • 转载:Pixhawk无人机扩展教程--树莓派安装Dronekit及读取飞控数据

    寻找了一段时间 xff0c 发现Dronekit Python可以实现脱离遥控器来控制无人机 xff0c 找到了一些较好的教程 xff0c 但是中间也踩了一些坑 先转载一下教程 xff0c 遇到的哪些坑以后再写 这里

随机推荐