Ubuntu下udp通信

本文详细介绍了socket编程的基础概念,包括套接字创建、协议选择、socket()函数、IPv4/IPv6区别、网络字节顺序、htons/htonl函数以及UDP协议的使用。同时讨论了bind()和sendto()/recvfrom()函数,以及如何在类中利用析构函数管理资源。还澄清了服务器端和客户端的区别在UDP协议中的含义。
摘要由CSDN通过智能技术生成

一、知识准备阶段

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,不存在请求连接和受理过程,因此在某种意义上无法明确区分服务器端和客户端,只是因为其提供服务而称为服务器端
  • 18
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁博特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值