UDP通信 [补档-2023-07-22]
UDP通信
6-1 简介
UDP通信是面向无链接的,不稳定,不可靠,不安全的一种通信方式。TCP在通信前发送方会向接收方进行三次握手链接,然后确认双方链接后才会进行数据传输,最后四次挥手保证链接关闭。而UDP不会三次握手四次挥手,它会直接向发送方发送数据,无论接收方是否会收到,所以UDP更适合在稳定的网络环境中使用。
6-2 UDP通信相关函数
6-2-1 recvfrom函数
头文件:#include <sys/socket.h>
函数原型:ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
函数功能:接收消息。如果没有数据到来函数会一直阻塞,直到有数据到来或者发送错误。
函数参数:
sockfd:套接字。
buf:用于存放接收消息的缓冲区。
len:缓冲区的长度。
flags:标志位,一般填0。
src_addr:返回发送方的地址信息,包括ip和端口号
addrlen:表示scr_addr指向的缓冲区大小,作为输出参数表示实际发送方地址的长度。
函数返回值:
成功:返回接收的数据的字节数量。
失败:返回-1。
发送错误:返回-1
6-2-2 sendto函数
头文件:#include <sys/socket.h>
函数原型:ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
函数功能:发送数据。
函数参数:
sockfd:套接字。
buf:指向要发送的数据的缓冲区。
len:要发送的数据的长度。
flags:传输标志,用于控制发送过程的行为,通常设置为0。
dest_addr:指向目标地址的指针,其中包含目标ip和端口号信息。
addrlen:目标地址结构体的长度。
函数返回值:
成功:返回实际发送的字节数。
错误:返回-1。
6-3 使用UDP通信的服务端编写步骤
第一步:创建一个套接字,但是socket函数的第二个参数要填 SOCK_DGRAM来将协议改为UDP
第二步:将刚才创建的套接字与本地地址绑定。
第三步:进入一个循环然后使用recvfrom函数来接收数据,接收到数据可以处理数据,然后使用sendto将处理好的数据回应给客户端。
第四步:重复第三步,如果服务端需要关闭了记得关闭掉第一步创建的套接字描述符。
6-4 使用UDP通信的客户端编写步骤
第一步:创建一个套接字,但是socket函数的第二个参数要填 SOCK_DGRAM来将协议改为UDP
第二步:可以根据实际开发的需要,进入一个循环体持续收发数据或者是只收发一次数据。收发数据的函数就是上面的那两个。
第三步:重复第二步,如果不需要发送数据了记得关闭第一步创建的套接字。
6-5 服务端代码示例
点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netiner/in.h>
#include <ctype.h>
#include <sys/socket.h>
int main()
{
//创建套接字,记得使用SOCK_DGRAM
int cfd = socket(AF_INET, SOCK_DGRAM,0);
if (cfd < 0) {
perror("创建套接字失败!");
return -1;
}
struct sockaddr_in serv;//用来保存服务端地址信息,用来绑定地址
struct sockaddr_in clie;//用来保存客户端地址信息,一会用于通信
serv.sin_family = AF_INET;
serv.sin_port = htons(10066);
serv.sin_addr.s_addr = htonl(INDAAR_ANY);
bind(cfd, (struct sockaddr*)&serv, sizeof(serv));
int n;//用来记录recvfrom从客户端接收了多少个字节的数据
char data[100];//用来存储来自客户端的信息
char serv_data[100] = "服务端已经接收到数据"; //服务端的回应
socklen_t len;//用来记录客户端地址信息的大小
while (1) {
//读数据
memset(data, 0x00, sizeof(data));//初始化
len = sizeof(clie);//记录大小
//接收数据
n = recvfrom(cfd, data, szieof(data), 0, (struct sockaddr*)&clie, &len);
//发数据(处理数据)
sendto(cfd, serv_data, n, 0, (struct sockaddr *)&clie,len);
}
//关闭套接字
close(cfd);
}
6-6 客户端代码示例
点击查看代码
//udp客户端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <ctype.h>
int main()
{
//创建socket
int cfd = socket(AF_INET, SOCK_DGRAM, 0);
if (cfd < 0)
{
perror("socket error");
return -1;
}
int n;
char buf[1024];
struct sockaddr_in serv;
serv.sin_family = AF_INET;
serv.sin_port = htons(8888);
inet_pton(AF_INET, "127.0.0.1", &serv.sin_addr.s_addr);
while (1)
{
//读标准输入数据
memset(buf, 0x00, sizeof(buf));
n = read(STDIN_FILENO, buf, sizeof(buf));
//发送数据
sendto(cfd, buf, n, 0, (struct sockaddr*)&serv, sizeof(serv));
//读取数据
memset(buf, 0x00, sizeof(buf));
n = recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);
printf("n==[%d], buf==[%s]\n", n, buf);
}
//关闭套接字
close(cfd);
return 0;
}
UDP通信 [补档-2023-07-22]的更多相关文章
- VC++使用socket进行TCP、UDP通信实例总结
1. 两台计算机通信需要协议,通信的两台计算机IP必须唯一 2. 同一个计算机可以进行多个应用程序与其他计算机通信,IP地址唯一,而端口号是区别同一计算机(同一IP)的唯一 ...
- ACE中UDP通信
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/07/585205.html udp是一种无连接的协议,提供无连接不可靠的服务. 在ace中,通 ...
- java基础 UDP通信 user datagram protocol 用户数据豆协议 TCP transmission control protocol 传输控制协议 多线程TCP
无连接通信 UDP 客户端 package com.swift.test; import java.io.IOException; import java.net.DatagramPacket; im ...
- Python的网络编程[0] -> socket[2] -> 利用 socket 建立 TCP/UDP 通信
Socket 目录 socket 的 TCP/IP 通信基本建立过程 socket 的 UDP 通信基本建立过程 socket 的 UDP 广播式通信基本建立过程 socket 的多线程通信建立过程 ...
- vector(可变数组) 用于UDP通信
头文件: #include<vector.h> 然后,声明并初始化vctor数组. vector<char> str(len); 其中len可以是变量或者常量.(其实用常量就 ...
- STL 补档
STL 补档 1.vector 作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. vector在C++标准模板库中的部分内容,它是 ...
- 微信小程序UDP通信
前言 UDP通信分为单播 广播 组播,基础库2.7.0之后,小程序开始支持UDP通信,目前小程序只支持单播. 小程序API 小程序UDP通信这一块可以说是很简单了就一个UDPSocket实例.然后bi ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.2
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
随机推荐
- OKR之剑·实战篇06:OKR致胜法宝-氛围&业绩双轮驱动(下)
作者:vivo 互联网平台产品研发团队 本文是<OKR 之剑>系列之实战第 6 篇-- 本文介绍团队营造氛围的方法与实践.在业绩方面的探索与输出,在两方面分别总结了一些经验分享给大家. 一 ...
- go语言-Go环境搭建
go语言-Go环境搭建 下载 https://golang.org/dl/ 切换root权限 su root 进入用户列表 cd /usr/local/ 解压缩 tar -zxvf go1.13.li ...
- vue学习笔记 七、方法的定义和使用
系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...
- Liunx常用操作(七)-文件上传下载方法
如下介绍了几个比较方便的liunx软件的文件维护方法 一.SZ,RZ liunx服务器上安装 通过apt来安装z.sz:安装后直接上传下载文件 apt-get install lrzsz 用法: # ...
- HTTP协议六种请求:GET,HEAD,PUT,DELETE,POST
Http定义了与服务器交互的不同方法,标准Http协议支持六种请求方法,即: 1.GET 2.POST 3.PUT 4.Delete 5.HEAD 6.Options 最基本的方法有4种,分别是GET ...
- C++ ——vector数组笔记
vector 是 C++ 标准库中的一个动态数组容器(Sequence Container),它可以自动管理内存大小,可以在运行时根据需要动态增长或缩小.它是一个非常常用且强大的容器,用于存储一系列元 ...
- VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- SV Clocking Review
clocking会设置input和output的延时 default input #3ns output #1ns 数据是在时钟上升沿驱动的,在时钟上升沿,将vld驱动到dut,dut中也会在时钟上升 ...
- 【BUS】动画图解嵌入式常见的通讯协议:SPI、I²C、UART、红外 ......
SPI传输 SPI数据传输 SPI数据传输 SPI时序信号 I2C传输 2C总线寻址 UART传输 PC-UART-MCU RS-232电平转换 红外控制 红外通信 红外信号接收.放大.整形 红外控制 ...
- JVM的GC学习
JVM的GC学习 2023-12-28T17:20:25.182+0800: 7.363: [Full GC (Metadata GC Threshold) [PSYoungGen: 29067K-& ...