c++如何设计用固定大小队列收取udp组包数据
时间: 2024-02-09 08:13:37 浏览: 19
你可以使用C++ STL中的std::deque容器来实现一个固定大小的队列来收取UDP组包数据。以下是一个示例代码:
```c++
#include <iostream>
#include <deque>
#include <cstring>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define BUF_SIZE 1024
#define QUEUE_SIZE 10
int main(int argc, char *argv[]) {
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1) {
std::cerr << "socket error" << std::endl;
return 1;
}
struct sockaddr_in addr;
std::memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(12345);
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
std::cerr << "bind error" << std::endl;
return 1;
}
std::deque<std::string> queue;
while (true) {
char buf[BUF_SIZE];
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
ssize_t recv_len = recvfrom(sock, buf, BUF_SIZE, 0, (struct sockaddr*)&client_addr, &client_addr_len);
if (recv_len < 0) {
std::cerr << "recvfrom error" << std::endl;
continue;
}
std::string recv_str(buf, recv_len);
if (queue.size() >= QUEUE_SIZE) {
queue.pop_front();
}
queue.push_back(recv_str);
std::cout << "Received: " << recv_str << std::endl;
std::cout << "Queue Size: " << queue.size() << std::endl;
}
close(sock);
return 0;
}
```
在这个示例代码中,我们首先创建了一个UDP socket,并绑定到本地地址和端口号。然后,我们使用一个std::deque容器来保存接收到的UDP数据包。如果队列已满,则弹出队列的最前面的数据,然后将新的数据包添加到队列的尾部。
这个实现方式可以让你限制队列的大小,并且最新的数据包会一直被保存在队列的最后面。