gpt4 book ai didi

c - 如何按 C 中的 IP 地址对传输进行分组以计算传输率?

转载 作者:太空宇宙 更新时间:2023-11-04 08:50:25 25 4
gpt4 key购买 nike

我是 C 的初学者,我被困在一个有趣的问题上。

我正在捕获端口 80 上的所有传出数据包,我想计算每个 IP 的传输速度。但问题是我不知道如何对这些 IP 地址进行分组,在 PHP 中我可以通过 IP 创建一个数组和索引条目并搜索一个数组,如果 IP 索引已经存在更新值字节传输然后除以经过的秒数和我有 B/s 的传输速度。但是在 C 中我不能这样做。

请建议我如何解决我的问题,因为现在我只能计算整体传输速度。

  t2 = time(0);
time_elapsed = (int) (t2-t1);
if(time_elapsed > 0) {
bytes += Size;
//packets size SUM from all IP addresses, which is incorrect

printf("IP: %s | Size: %d\n\n", inet_ntoa(dest.sin_addr), Size);
}

输出

IP: 77.236.192.100 | Size: 4434

IP: 89.176.81.106 | Size: 43854

IP: 89.176.81.106 | Size: 20494

IP: 89.176.81.106 | Size: 24874

IP: 77.236.192.100 | Size: 7354

IP: 89.176.81.106 | Size: 39474

IP: 89.176.81.106 | Size: 16114

最佳答案

在 C 中,您可以使用带指针的链式节点,也称为队列、列表或堆栈(取决于其结构)。我有一个可能适合您的代码:

struct _ip_map_node {
struct _ip_map_node* next;
unsigned long ip;
unsigned long transfered;
unsigned long time;
};
typedef struct _ip_map_node ip_map_node;

ip_map_node* update_or_create_ip_map_node(ip_map_node** queue, unsigned long ip, unsigned long transfered) {
ip_map_node* node = *queue;
while (node) {
if (node->ip == ip) {
node->transfered += transfered;
return node;
}
node = node->next;
}
node = malloc(sizeof(ip_map_node));
node->next = *queue;
*queue = node;

node->ip = ip;
node->transfered = transfered;
node->time = time(NULL);

return node;
}

void remove_ip_map_node(ip_map_node** queue, unsigned long ip) {
ip_map_node* last = NULL;
ip_map_node* curr = *queue;
while (curr) {
if (curr->ip == ip) {
if (last)
last->next = curr->next;
else
*queue = curr->next;

free(curr);
break;
}
last = curr;
curr = curr->next;
}
}

ip_map_node* my_ip_map = NULL;

我做了一些更改以最适合您的目的,但没有检查它是否编译,如果您无法弄明白我可以帮助您。

这基本上就是您使用它的方式:您有一个名为 my_ip_map 的 IP 列表,默认情况下它是空的。

您可以在其中创建元素或使用以下方法更新它:

ip_map_node* node = update_or_create_ip_map_node(&my_ip_map, dest.sin_addr.s_addr, data_size);

其中 data_size 是当时传输到该 IP 的字节数。它将自动与之前发送到同一 IP 的金额相加。

节点然后具有以下属性:

node->ip; // The IP in numeric format, use inet_ntoa() to transform it
node->transfered; // The amount that was transfered to that IP so far
node->time; // the time(NULL) when the first packet was sent to this IP

您现在可以使用 node->transferred/(time(NULL) - node->time) 获取传输速度——要小心,因为被零除会崩溃。

如果你想每隔几秒重置一次这个节点,你可以使用:

node->transfered = 0;
node->time = time(NULL);

或者删除它:

remove_ip_map_node(&my_ip_map, dest.sin_addr);

要运行列表中的所有 IP,您可以使用例如:

ip_map_node* node = my_ip_map;
while(node) {
printf("%s, %d\n", inet_ntoa(*(struct in_addr *)&node->ip), node->transfered);
node = node->next;
}

出于性能原因,其结构为堆栈(最后添加的元素最先出现)。

关于c - 如何按 C 中的 IP 地址对传输进行分组以计算传输率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19867801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com