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]的更多相关文章

  1. VC++使用socket进行TCP、UDP通信实例总结

    1.        两台计算机通信需要协议,通信的两台计算机IP必须唯一 2.        同一个计算机可以进行多个应用程序与其他计算机通信,IP地址唯一,而端口号是区别同一计算机(同一IP)的唯一 ...

  2. ACE中UDP通信

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/07/585205.html udp是一种无连接的协议,提供无连接不可靠的服务. 在ace中,通 ...

  3. java基础 UDP通信 user datagram protocol 用户数据豆协议 TCP transmission control protocol 传输控制协议 多线程TCP

    无连接通信 UDP 客户端 package com.swift.test; import java.io.IOException; import java.net.DatagramPacket; im ...

  4. Python的网络编程[0] -> socket[2] -> 利用 socket 建立 TCP/UDP 通信

    Socket 目录 socket 的 TCP/IP 通信基本建立过程 socket 的 UDP 通信基本建立过程 socket 的 UDP 广播式通信基本建立过程 socket 的多线程通信建立过程 ...

  5. vector(可变数组) 用于UDP通信

    头文件: #include<vector.h> 然后,声明并初始化vctor数组. vector<char>  str(len); 其中len可以是变量或者常量.(其实用常量就 ...

  6. STL 补档

    STL 补档 1.vector 作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. vector在C++标准模板库中的部分内容,它是 ...

  7. 微信小程序UDP通信

    前言 UDP通信分为单播 广播 组播,基础库2.7.0之后,小程序开始支持UDP通信,目前小程序只支持单播. 小程序API 小程序UDP通信这一块可以说是很简单了就一个UDPSocket实例.然后bi ...

  8. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.3

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  9. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.2

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  10. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

随机推荐

  1. let、var、const区别

    1.var:传统的变量声明方式 在ES5及之前的JavaScript版本中,我们通常使用var关键字声明变量.var具有以下特点: 函数作用域:变量的作用域限制在声明的函数内部,如果在函数外部访问,将 ...

  2. 畅捷通的 Serverless 探索实践之路

    作者:计缘 畅捷通介绍 畅捷通是中国领先的小微企业财税及业务云服务提供商,成立于2010年.畅捷通在2021年中国小微企业云财税市场份额排名第一,在产品前瞻性及行业全覆盖方面领跑市场,位居中国小微企业 ...

  3. windows 系统关闭占用端口的应用

    开发中有时候开发工具把程序关闭了,但是后台并没有真正关闭程序,导致再次启动相同端口的程序时报端口已经被使用的错误,这时如何强制关闭已占用的端口 1.打开dos对话框 2.查找被占用的端口的进程号 ne ...

  4. vue中我改变了data中的一个值,但现在视图上没有实时更新,请问我怎么拿到更新后的值?

    Vue在数据初始化的时候会对data,computed,watcher中的属性进行依赖收集,如果支持proxy,则直接使用proxy进行拦截,好处是可以深层次的进行拦截,如果不支持proxy,则使用o ...

  5. kubernetes 资源管理概述

    本文转载自 Cizixs 的博客 kubernetes 资源管理概述 kubernetes 资源简介 什么是资源? 在 kubernetes 中,有两个基础但是非常重要的概念:node 和 pod.n ...

  6. 斐波拉契序列的 Go 实现

    本篇文章主要介绍斐波拉契序列的 Go 语言实现. 斐波拉契序列: 前面相邻两项之后构成后一项. 1. 循环迭代 package main import "fmt" const ma ...

  7. 使用WTM框架创建博客系统后台并在云服务器发布

    阅读导航 关于lqclass.com 博客后台前后端部署 2.1 已部署访问链接 2.2 nginx 部署 2.2.1 后台后端发布 2.2.2 后台前端发布 2.2.3 云服务器部署 下次分享 1. ...

  8. C++模板显示指定类型时使用引用遇到的问题

    1.问题 这里我想让模板函数接收int和char类型的参数,并进行相加,显示指定参数类型为int. 第一个调用理论上会自动将char类型强转成int类型,后进行相加: 第二个调用理论上会自动将int类 ...

  9. Go-发送邮件

    1. 邮件 - mail From -- 发送者(这封邮件由谁进行发送的,一般都是该邮件的作者) To -- 邮件的接收者(发送邮件的人希望谁能收到邮件) Subject -- 邮件的主题(类似文章的 ...

  10. Go-数据类型-函数

    函数类型 函数声明本质上是定义了函数类型的变量 package main import "fmt" // 定义了函数,本质上是在全局作用域中声明了一个函数类型的变量 info 其类 ...