Ubuntu下udp通信

news/2024/10/18 0:29:29/

一、知识准备阶段

socket是什么?套接字是什么?

https://blog.csdn.net/m0_37925202/article/details/80286946

Socket程序从Windows移植到Linux下的一些注意事项

sockaddr和sockaddr_in详解

bzero和memset函数

函数原型:void bzero(void *s, int n);头文件:#include <string.h>功能:将字符串s的前n个字节置为0,一般来说n通常取sizeof(s),将整块空间清零。返回值:无返回值

socket()函数用法详解

socket() 函数来创建套接字,在 Windows 和 Linux两个平台下的参数是相同的,不同的是返回值。

Linux 下的 socket() 函数:
使用 socket() 函数创建套接字以后,返回值就是一个 int 类型的文件描述符。
//标准形式
int socket(int af, int type, int protocol); int tcp_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  //IPPROTO_TCP表示TCP协议
int udp_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  //IPPROTO_UDP表示UDP协议//只有一种协议满足条件,可以将 protocol 的值设为 0,系统会自动推演出应该使用什么协议
int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);  //创建TCP套接字
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);  //创建UDP套接字

IPv4与IPv6之间的区别是什么

NBO和HBO

网络字节顺序NBO(Network Byte Order):
按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。

主机字节顺序HBO(Host Byte Order):
不同的机器HBO不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。

详解C语言的htons和htonl函数、大尾端、小尾端

htons 是把你机器上的整数转换成“网络字节序”, 网络字节序是 big-endian,也就是整数的高位字节存放在内存的低地址处。
而我们常用的 x86 CPU (intel, AMD) 电脑是 little-endian,也就是整数的低位字节放在内存的低字节处。
举个例子:
假定你的port是0x1234,

  • 在网络字节序里 这个port放到内存中就应该显示成addr addr+1,也就是:0x12 0x34;
  • 而在x86电脑上,0x1234放到内存中实际是:addr addr+1,也就是:0x34 0x12。

htons 的用处就是把实际内存中的整数存放方式调整成“网络字节序”的方式。

htons 把unsigned short类型从主机序转换到网络序
htonl 把unsigned long类型从主机序转换到网络序
ntohs 把unsigned short类型从网络序转换到主机序
ntohl 把unsigned long类型从网络序转换到主机序

IPv4地址结构体sockaddr_in详解

网络编程之sockaddr_ll结构体

sockaddr_ll, 源文件为<netpacket/packet.h>,结构如下:

struct sockaddr_ll
{unsigned short int sll_family; /* 一般为AF_PACKET */unsigned short int sll_protocol; /* 上层协议 */int sll_ifindex; /* 接口类型 */unsigned short int sll_hatype; /* 报头类型 */unsigned char sll_pkttype; /* 包类型 */unsigned char sll_halen; /* 地址长度 */unsigned char sll_addr[8]; /* MAC地址 */
};

socket编程之inet_addr和inet_ntoa

  • inet_addr 将字符串形式的IP地址 -> 网络字节顺序的整型值

  • inet_ntoa 将网络字节顺序的整型值 ->字符串形式的IP地址

c++中c_str()的用法详解

c_str():生成一个const char*指针,指向以空字符终止的数组。

setsockopt()用法(参数详细说明)

参考文章
setsockopt()函数用于任意类型、任意状态套接口的设置选项值。

int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);

s(套接字): 指向一个打开的套接口描述字
level:(级别): 指定选项代码的类型。

SOL_SOCKET: 基本套接口
IPPROTO_TCP: TCP套接口
IPPROTO_IP: IPv4套接口
IPPROTO_IPV6: IPv6套接口

optname(选项名):

选项类型意义
SO_BROADCASTBOOL允许套接口传送广播信息。
SO_DEBUGBOOL记录调试信息。
SO_DONTLINERBOOL不要因为数据未发送就阻塞关闭操作。 设置本选项相当于将SO_LINGER的l_onoff元素置为零。
SO_DONTROUTEBOOL禁止选径;直接传送。
SO_KEEPALIVEBOOL发送“保持活动”包。
SO_LINGER struct lingerFAR*如关闭时有未发送数据,则逗留。
SO_OOBINLINEBOOL在常规数据流中接收带外数据。
SO_RCVBUFint为接收确定缓冲区大小。
SO_REUSEADDRBOOL允许套接口和一个已在使用中的地址捆绑(参见bind())。
SO_SNDBUFint指定发送缓冲区大小。
TCP_NODELAYBOOL禁止发送合并的Nagle算法。

optval(选项值):是一个指向变量的指针 类型:整形,套接口结构, 其他结构类型:linger{}, timeval{ }
optlen(选项长度) :optval 的大小

SO_REUSEADDR
  • SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。对于TCP,我们绝对不可能启动捆绑相同IP地址和相同端口号的多个服务器:这是完全重复的捆绑,即使我们给第二个服务器设置了SO_REUSEADDR套接字也不管用。

  • SO_REUSEADDR 允许单个进程捆绑同一端口到多个套接字上,只要每次捆绑指定不同的本地IP地址即可。

  • SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口号已绑定到某个套接字上时,如果传输协议支持,同样的IP地址和端口还可以捆绑到另一个套接字上。一般来说本特性仅支持UDP套接字。

二、UDP协议代码

UDP 中只有创建套接字的过程和数据交换的过程

UDP协议 sendto 和 recvfrom 浅析与示例 (有代码)

C语言sendto()函数:经socket传送数据 (有代码)

bind()函数介绍

bind()函数将长度为addlen的struct sockadd类型的参数my_addr与sockfd绑定在一起,将sockfd绑定到某个端口上,如果使用connect()函数则没有绑定的必要。绑定的函数原型如下:

#include<sys/types.h>
#include<sys/socket.h>
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行

Q-A

1.为什么需要建立类?

  • 因为建立类后,可以巧妙的利用析构函数,释放udp节点

2.为什么我分不清服务器端和客户端?

  • UDP 不同于 TCP,不存在请求连接和受理过程,因此在某种意义上无法明确区分服务器端和客户端,只是因为其提供服务而称为服务器端

http://www.ppmy.cn/news/1401961.html

相关文章

Android开发 OCR:通过Tesseract实现图片文字识别

下面是整个详解步骤过程 效果图一、OCR的含义二、什么是Tesseract三、前提准备1、添加依赖2、数据文件下载路径 四、实际代码案例Demo如下&#xff1a;Main.xmlMain.java 效果图 流程&#xff1a;获取assets中的图片显示到页面&#xff0c;提取照片内的文字 一、OCR的含义 o…

二、分布式事务

目录 二、分布式事务2.1 什么是分布式事务2.2 分布式事务产生的背景2.3 分布式事务产生的场景2.4 分布式事务理论4.1 CAP理论4.2 Base理论 5、分布式事务的解决方案 二、分布式事务 2.1 什么是分布式事务 一组操作会产⽣多个数据库session会话 此时就会出现分布式事务 2.2 分…

开源AI引擎:文本自动分类在公安及消防执法办案自动化中的应用

一、实际案例介绍 通过文本分类算法自动化处理文本数据&#xff0c;快速识别案件性质和关键特征&#xff0c;极大地提高了案件管理和分派的效率。本文将探讨这两种技术如何帮助执法机构优化资源分配&#xff0c;确保案件得到及时而恰当的处理&#xff0c;并增强公共安全管理的…

Android数据存储:SQLite、Room

在Android平台上&#xff0c;集成了一个嵌入式关系型数据库—SQLite&#xff0c;SQLite3支持 NULL、INTEGER、REAL&#xff08;浮点数字&#xff09;、TEXT(字符串文本)和BLOB(二进制对象)数据类型&#xff0c;虽然它支持的类型只有五种&#xff0c;但实际上sqlite3也接受varch…

阿里云服务器初始化简记

文章目录 推荐版本CPU、内存、硬盘视活动而定&#xff0c;一般活动价99元一年注意带宽云服务器具体设置建议系统推荐CentOS 7.9本地系统推荐MacOSiTerm2本地系统推荐Win11Linux子系统推荐开发环境NginxPythonMySQL 机器和系统基本状况测试网速设置Vim显示中文其他系统状态监控和…

复制构造函数的使用

#include<iostream> using namespace std; class sample{ public:int v;sample(int n):v(n){}sample(const sample & c){v2*c.v;} }; int main(){sample a(5);sample ba;cout<<b.v;return 0; }

JSQLParserException异常

前言 SQL中加入了租户字段&#xff0c;报这个错&#xff0c;可以查出数据&#xff0c;但是不多&#xff1b;SQL检查无问题 解决 原因一 引入新的SQL解析器检查解析SQL&#xff0c;与mybatis多租户无关 参考 <!--jsqlparser版本太低也无法解析&#xff0c;如2.0--> &…

厦门攸信技术亮相新技术研讨会,展现物流自动化解决方案新高度!

今日&#xff0c;厦门攸信信息技术有限公司受邀参加了一场备受行业关注的电子制造高端盛会——一步步新技术研讨会&#xff0c;凭借卓越的智能制造与物流自动化技术在会议中大放异彩。作为一家引领行业发展的企业&#xff0c;厦门攸信技术不仅展示了其深厚的技术底蕴&#xff0…