admin
2026-07-04 10:03:37
#include
#include
#include
#include
#define QUEUE_SIZE 10
typedef struct {
int packets[QUEUE_SIZE];
int front;
int rear;
int size;
pthread_mutex_t lock;
} PacketQueue;
void init_queue(PacketQueue* queue) {
queue->front = 0;
queue->rear = 0;
queue->size = 0;
pthread_mutex_init(&queue->lock, NULL);
}
int is_empty(PacketQueue* queue) {
return queue->size == 0;
}
int is_full(PacketQueue* queue) {
return queue->size == QUEUE_SIZE;
}
void enqueue(PacketQueue* queue, int packet) {
pthread_mutex_lock(&queue->lock);
if (is_full(queue)) {
printf("Queue is full!n");
pthread_mutex_unlock(&queue->lock);
return;
}
queue->packets[queue->rear] = packet;
queue->rear = (queue->rear + 1) % QUEUE_SIZE;
queue->size++;
pthread_mutex_unlock(&queue->lock);
}
int dequeue(PacketQueue* queue) {
pthread_mutex_lock(&queue->lock);
if (is_empty(queue)) {
printf("Queue is empty!n");
pthread_mutex_unlock(&queue->lock);
return -1;
}
int packet = queue->packets[queue->front];
queue->front = (queue->front + 1) % QUEUE_SIZE;
queue->size--;
pthread_mutex_unlock(&queue->lock);
return packet;
}
void send_packet(int packet) {
// 模拟发送数据包的函数
printf("Packet %d sent!n", packet);
}
int get_network_delay() {
// 使用ping命令检测网络延迟
FILE* fp;
char buffer[128];
int delay = 0;
fp = popen("ping -c 1 google.com | grep 'time=' | awk -F'=' '{print $4}' | awk '{print $1}'", "r");
if (fp == NULL) {
printf("Failed to run commandn" );
exit(1);
}
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
delay = atoi(buffer);
}
pclose(fp);
return delay;
}
void* sender_thread(void* arg) {
PacketQueue* queue = (PacketQueue*)arg;
while (1) {
int packet = dequeue(queue);
if (packet != -1) {
send_packet(packet);
}
usleep(500000); // 暂停0.5秒
}
}
int main() {
PacketQueue queue;
init_queue(&queue);
pthread_t thread;
pthread_create(&thread, NULL, sender_thread, (void*)&queue);
for (int i = 0; i < 15; i++) {
int delay = get_network_delay();
printf("Network delay: %d msn", delay);
if (delay < 50) {
enqueue(&queue, i);
} else {
printf("Network delay is too high, pausing...n");
}
usleep(1000000); // 暂停1秒
}
pthread_join(thread, NULL);
return 0;
}