当前位置: 首页 > news >正文

Ubuntu下udp通信

一、知识准备阶段

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.lryc.cn/news/328872.html

相关文章:

  • 拌合楼管理软件开发(十三) 对接耀华XK3190-A9地磅(实战篇)
  • FastAPI+React全栈开发10 MongoDB聚合查询
  • python 报错问题汇总
  • 6.5物联网RK3399项目开发实录-驱动开发之LCD显示屏使用(wulianjishu666)
  • 「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K
  • 【算法】基数排序
  • 2核2G服务器优惠价格轻量61元一年,CVM价格313元15个月
  • 不同Python版本和wxPython版本用pyinstaller打包文件大小对比
  • 【C语言】结构体详解(一)
  • AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion)
  • 【蓝桥杯】矩阵快速幂
  • C语言使用STM32开发板手搓高端家居洗衣机
  • 【Hello,PyQt】QTextEdit和QSplider
  • 【力扣】191.位 1 的个数、485.最大连续 1 的个数
  • 蓝桥杯 java 承压计算
  • leetcode268-Missing Number
  • 【jenkins+cmake+svn管理c++项目】jenkins回传文件到svn(windows)
  • 数据结构·二叉树(2)
  • MATLAB算法实战应用案例精讲-【毕业季论文专用】人工智能视觉检测技术及其在实际应用中的挑战与前景
  • Linux虚拟机环境搭建spark
  • STL的string容器
  • 半导体工艺技术
  • acwing算法提高之图论--单源最短路的扩展应用
  • SQLServer数据库使用Function实现根据字段内容的拼音首字母进行数据查询
  • Linux——信号概念与信号产生方式
  • 赋值语句还能当判断条件?涨芝士了!
  • 数据结构 - 算法效率|时间复杂度|空间复杂度
  • 接口自动化之 + Jenkins + Allure报告生成 + 企微消息通知推送
  • 『Apisix安全篇』探索Apache APISIX身份认证插件:从基础到实战
  • 【01-20】计算机网络基础知识(非常详细)从零基础入门到精通,看完这一篇就够了