Linux学习——UDP

编程的整体框架

bind:绑定服务器:TCP地址和端口号

receivefrom():阻塞等待客户端数据

sendto():指定服务器的IP地址和端口号,要发送的数据

无连接尽力传输**,UDP:是不可靠传输**

实时的音视频传输,DNS域名解析包

服务端编写

step1:socket

复制代码
int socket(int domain,int type,int protocol);
参数
    domain
    AF_INET
    AF_INET6
    AF_UNIX,AF_LOCAL
    AF_NETLINK
    AF_PACKET
type
    SOCK_STREAM: 流式套接字,唯一对应于TCP
    SOCK_DGRAM:数据报套接字,唯一对应着UDP
    SOCK_RAW:原始套接字
protocol
    一般填0,原始套接字编程时需填充
返回值
    成功返回文件描述符
    出错返回-1

step2:addr

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

复制代码
sockfd
通过socket()创建的套接字文件描述符,例如int sockfd = socket(AF_INET, SOCK_STREAM, 0);2

level
选项的协议层级,常见值:
SOL_SOCKET:通用套接字层级(如SO_REUSEADDR)
IPPROTO_TCP:TCP协议层级(如TCP_NODELAY)
IPPROTO_IP:IP协议层级(如IP_TTL)

optname
具体选项名称,常用选项:
SO_REUSEADDR:允许地址复用(解决bind时的Address already in use问题)
SO_RCVTIMEO:设置接收超时时间
SO_SNDBUF:调整发送缓冲区大小

optval
选项值的指针,类型根据选项不同而变化:
布尔值:int reuse = 1;
时间结构:struct timeval timeout = {5, 0};(5秒超时)
缓冲区大小:int buf_size = 8192;

optlen
选项值的字节长度,例如sizeof(reuse)

step3:bind,错误返回-1

定义结构体

清空结构体

填充

调用bind函数

sockaddr_in创建的是网络字节序

主机字节序到网络字节序

u_long htonl(u_long hostlong);

u_short htons(u_short short);

step4:while中revcform

  • sockfd:需要读取的套接字描述符。
  • buf:数据读取到的缓冲区的指针。
  • len:buf的最大长度。
  • flags:一组影响函数行为的标志位。
  • src_addr:一个指向源地址结构的指针。
  • addrlen:一个指向源地址结构长度的指针。

成功时返回接收的字节数,失败时返回-1

失败返回-1

需要将获取的网络字节序转换成字符串

复制代码
将32位网络字节序二进制地址转换成点分十进制的字符串
inet_pton()
    int inet_pton(int af, const char* src ,void* dst)
    将IPV4/IPV6 的地址转换成binary格式
    使用于IPV4/IPV6
    能正确处理255.255.255.255的转换问题

参数:
    1.地址协议族(AF_INET或AF_INET6)
    2.src:是一个指针(填写分点形式的IP地址(主要指IPV4))
    dst:转换的结果给到dst

我们是接收,用的是下面的

inet_ntop(int af,const void *src,char *dst,socklen_t size)
把ipv4和ipv6的网络字节序变成本地的字符串形式的IP地址
参数
1.af:地址协议族(AF_INET或AF_INET6)
2.src:是一个指针(32),(结构体里内容)
3.dst:输出结果为32位点分形式的IP地址
4.size:长度

成功返回非零

客户端编写

客户端是需要传参进去的,main就需要带参数

进行判断传参格式是否正确

使用socket函数,判断是都成功

成功之后将键盘输入的端口好转型为int给到定义的port

之后编写结构体(bind函数那部分内容)

while循环键盘输入内容

下面是sendto()函数知识点

复制代码
头文件:#include < sys/types.h >
头文件:#include < sys/socket.h >

int sendto ( socket s , const void * msg, int len, unsigned int flags,
                     const struct sockaddr * addr , int tolen ) ;

函数说明:sendto() 用来将数据由指定的socket传给对方主机。

参数说明:
    s:已建好连接的socket,如果利用UDP协议则不需经过connect操作。
    msg:待发送数据的缓冲区
    len:缓冲区长度
    flags:调用方式标志位, 一般为0, 改变flags,将会改变sendto发送的形式。
    addr:(可选)指针,指向目的套接字的地址
    tolen:addr所指地址的长度

返回值:
    如果成功,则返回发送的字节数
    失败则返回SOCKET_ERROR。
相关推荐
openHiTLS密码开源社区1 小时前
【密码学实战】openHiTLS passwd命令行:专业密码哈希生成工具
linux·密码学·哈希算法·ldap·密码策略·随机盐值
007php0071 小时前
某大厂跳动面试:计算机网络相关问题解析与总结
java·开发语言·学习·计算机网络·mysql·面试·职场和发展
知识分享小能手1 小时前
微信小程序入门学习教程,从入门到精通,微信小程序核心 API 详解与案例(13)
前端·javascript·学习·react.js·微信小程序·小程序·vue
WTCLLB1 小时前
netgear r6220 路由器,刷openwrt后,系统备份还原
linux·网络·智能路由器·openwrt
递归不收敛1 小时前
吴恩达机器学习课程(PyTorch 适配)学习笔记:3.3 推荐系统全面解析
pytorch·学习·机器学习
迎風吹頭髮2 小时前
UNIX下C语言编程与实践38-UNIX 信号操作:signal 函数与信号捕获函数的编写
linux·c语言·unix
做运维的阿瑞2 小时前
Linux系统性能监控与故障定位实战:CPU/内存/I/O/网络
linux·运维·网络
CiLerLinux3 小时前
第五十二章 ESP32S3 UDP 实验
网络·单片机·嵌入式硬件·网络协议·udp
驱动探索者3 小时前
车库到双子星:惠普的百年科技传奇
linux
又是忙碌的一天4 小时前
前端学习 JavaScript(2)
前端·javascript·学习