第一步是来认识库,需要哪些库,需要哪些库中的函数
哥们也只是,初学者,仅仅只是会调用的地步。后面有机会再加深。
首先咱们需要清除的知道工作流程
第二步是直接写代码
开发工具 qtcreator6 环境 win10 虚拟机 ubuntu20.04 运行环境 香橙派5
添加头文件
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
接收方
1.创捷套接字
2.bind绑定套接字
3.循环接收,或者发送
sockfd = socket(AF_INET, SOCK_DGRAM, 0); //套接字sockfd
if (sockfd < 0)
{
qDebug() << "Failed to create socket";
}
// 绑定地址和端口号
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
{
emit Respond("Failed to bind");
}
len = sizeof(cliaddr);
int flags = fcntl(sockfd, F_GETFL, 0);
if (flags < 0)
{
emit Respond("Failed to fcntl1");
}
if (fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) < 0) //设置套接字为非阻塞,套接字内部还有一些参数可以设置,比如接收缓冲区,等待延时。创建套接字默认是阻塞模式,什么是阻塞模式呢,就是recvfrom没有从系统中拿到数据就会一直阻塞再recvform函数中不出来,不return。
{
emit Respond("Failed to fcntl2");
}
int rcvbufsize = 100 * 1024 * 1024; //设置套接字接收缓冲区,好像有个默认限值,
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbufsize, sizeof(rcvbufsize)) < 0)
{
emit Respond("Failed to setsockopt");
}
while (!stop) //这是我的线程,stop用来停止线程
{
n = recvfrom(sockfd, buffer.data(), MAXLINE, 0, (struct sockaddr *)&cliaddr, &len); //buffer是bytearry 字节数组,不用qt的请自行定义
if (n > 0)
{
...//n>0 就是从内核中拿到数据了
}
}
close(sockfd);
以我认为详细的方式讲解下
创建套接字就是从内核拿一个网络句柄,用来跟内核搭桥通信。
绑定是为了过滤消息,收到别的消息,就不拿,拿指定特征的消息。可以省略这一步。
套接字默认接收缓冲很小,udp的运用环境一般都是为了高速,所以一般都要增大缓冲区。
发送方
很简单
1.创建套接字
2.设置要发送的地址
3.发送
sockfd = socket(AF_INET, SOCK_DGRAM, 0); //套接字sockfd
if (sockfd < 0)
{
qDebug() << "Failed to create socket";
}
// 绑定地址和端口号
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
ret = sendto(sockfd,buffer,strlen(buffer),0,&servaddr,sizeof(servaddr));
if(ret < 0)
{
qDebug() << "Failed to create socket";
continue;
}
注意设置servaddr的参数,INADDR_ANY和PORT 指定的数据格式填入,怎么转换为指定的数据格式请www.baidu.com