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_BROADCAST BOOL 允许套接口传送广播信息。
SO_DEBUG BOOL 记录调试信息。
SO_DONTLINER BOOL 不要因为数据未发送就阻塞关闭操作。 设置本选项相当于将SO_LINGER的l_onoff元素置为零。
SO_DONTROUTE BOOL 禁止选径;直接传送。
SO_KEEPALIVE BOOL 发送“保持活动”包。
SO_LINGER struct linger FAR* 如关闭时有未发送数据,则逗留。
SO_OOBINLINE BOOL 在常规数据流中接收带外数据。
SO_RCVBUF int 为接收确定缓冲区大小。
SO_REUSEADDR BOOL 允许套接口和一个已在使用中的地址捆绑(参见bind())。
SO_SNDBUF int 指定发送缓冲区大小。
TCP_NODELAY BOOL 禁止发送合并的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,不存在请求连接和受理过程,因此在某种意义上无法明确区分服务器端和客户端,只是因为其提供服务而称为服务器端

相关推荐

  1. Ubuntuudp通信

    2024-03-31 12:16:03       42 阅读
  2. SFML udp通信实例

    2024-03-31 12:16:03       40 阅读
  3. linuxtcp/udp协议网络通信接口封装+日志打印对象

    2024-03-31 12:16:03       38 阅读
  4. QT网络通信-TCP、UDP通信

    2024-03-31 12:16:03       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-31 12:16:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-31 12:16:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-31 12:16:03       87 阅读
  4. Python语言-面向对象

    2024-03-31 12:16:03       96 阅读

热门阅读

  1. es与mysql同步问题

    2024-03-31 12:16:03       39 阅读
  2. Leetcode 3. 无重复字符的最长子串

    2024-03-31 12:16:03       42 阅读
  3. 带头双向循环链表的实现及注释教学

    2024-03-31 12:16:03       39 阅读
  4. 面试碰到的一些问题

    2024-03-31 12:16:03       34 阅读
  5. PHP - ZipArchive上传、下载实例

    2024-03-31 12:16:03       40 阅读
  6. HTML 中的 jQuery 事件处理与 Ajax 异步请求

    2024-03-31 12:16:03       37 阅读
  7. 【图像处理】-1.图像二值化

    2024-03-31 12:16:03       39 阅读
  8. Mysql 常用语句及用法记录

    2024-03-31 12:16:03       34 阅读
  9. 阿里云服务器初始化简记

    2024-03-31 12:16:03       30 阅读
  10. 微信小程序渲染有问题

    2024-03-31 12:16:03       41 阅读
  11. Python100个库分享第4个—difflib

    2024-03-31 12:16:03       41 阅读
  12. Golang基础-7

    2024-03-31 12:16:03       35 阅读
  13. C# serialPort

    2024-03-31 12:16:03       34 阅读
  14. Python 变量、数据类型、数据类型的转换介绍

    2024-03-31 12:16:03       37 阅读