- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
关闭创建为AF_PACKET
和AF_INET
的套接字之间存在这种时间差异的原因是什么?如何减少 AF_PACKET
的关闭时间?
sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW);
close(sockfd); // 60000 μs
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
close(sockfd); // 30 μs
重现行为的代码:
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include <sys/socket.h>
#include <net/if.h>
int main() {
struct timeval time_start, time_end;
int sockfd;
if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) {
perror("socket error");
}
gettimeofday(&time_start, NULL);
close(sockfd);
gettimeofday(&time_end, NULL);
printf("close AF_PACKET: %ld \n", (time_end.tv_sec*1000000 + time_end.tv_usec) - (time_start.tv_sec*1000000 + time_start.tv_usec));
if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) {
perror("socket error");
}
gettimeofday(&time_start, NULL);
close(sockfd);
gettimeofday(&time_end, NULL);
printf("close AF_INET: %ld \n", (time_end.tv_sec*1000000 + time_end.tv_usec) - (time_start.tv_sec*1000000 + time_start.tv_usec));
return 0;
}
最佳答案
逻辑上这两个关闭系统调用没有显着差异
如果我像下面这样更改你的程序,
`
int main() {
struct timeval time_start, time_end;
int sockfd;
if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) {
perror("socket error");
}
gettimeofday(&time_start, NULL);
close(sockfd);
gettimeofday(&time_end, NULL);
printf("close AF_INET: %ld \n", (time_end.tv_sec*1000000 + time_end.tv_usec) - (time_start.tv_sec*1000000 + time_start.tv_usec));
if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) {
perror("socket error");
}
gettimeofday(&time_start, NULL);
close(sockfd);
gettimeofday(&time_end, NULL);
printf("close AF_PACKET: %ld \n", (time_end.tv_sec*1000000 + time_end.tv_usec) - (time_start.tv_sec*1000000 + time_start.tv_usec));
return 0;
}`
我看到的结果是
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 3471
close AF_PACKET: 4
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 8
close AF_PACKET: 7
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 8
close AF_PACKET: 6
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 8
close AF_PACKET: 5
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 9
close AF_PACKET: 5
类似的,如果我改成下面这样,
int main() {
struct timeval time_start, time_end;
int sockfd;
if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) {
perror("socket error");
}
gettimeofday(&time_start, NULL);
close(sockfd);
gettimeofday(&time_end, NULL);
printf("close AF_INET: %ld \n", (time_end.tv_sec*1000000 + time_end.tv_usec) - (time_start.tv_sec*1000000 + time_start.tv_usec));
if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) {
perror("socket error");
}
gettimeofday(&time_start, NULL);
close(sockfd);
gettimeofday(&time_end, NULL);
printf("close AF_INET: %ld \n", (time_end.tv_sec*1000000 + time_end.tv_usec) - (time_start.tv_sec*1000000 + time_start.tv_usec));
if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) {
perror("socket error");
}
gettimeofday(&time_start, NULL);
close(sockfd);
gettimeofday(&time_end, NULL);
printf("close AF_PACKET: %ld \n", (time_end.tv_sec*1000000 + time_end.tv_usec) - (time_start.tv_sec*1000000 + time_start.tv_usec));
return 0;
}
结果如下,
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 6
close AF_INET: 3
close AF_PACKET: 3
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 8
close AF_INET: 4
close AF_PACKET: 5
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 8
close AF_INET: 4
close AF_PACKET: 4
shahul@shahul-VirtualBox:~/test$ ./a.out
close AF_INET: 8
close AF_INET: 4
close AF_PACKET: 4
结论:基本上,第一次近距离通话需要更多时间,可能需要时间来映射第一次关闭系统调用函数。
关于c++ - 关闭 AF_PACKET 与 AF_INET 的时间差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56236545/
我对 EPOCH 时间有疑问。 我需要计算两个数据包之间的时间差。我不太确定如何: printf("Epoch Time: %d:%d seconds\n", header->ts.tv_sec, h
我正在尝试了解数字旋转的速度。我有一个程序,其中计数器从 0 开始。 每次用户单击按钮“加 1”。它将计数器递增 1。 计数器最大值为 255。在 255 之后它回到 0。 现在我想显示从 0 到递增
基本上我想做的是根据 SIP 信令获取通话持续时间。 我有一个包含如下所示记录的表,我正在尝试编写一个返回以下内容的 SELECT 语句: id callid date
您好,我需要有关 MySQL 数据库查询的帮助。 我有一个看起来像这样的表: ID TRACKID DATE Name Action 38
细节。我有包含以下列的注释表。 ID - INT(3) Date - DateTime Note - VARCHAR(100) Tile - Varchar(100
午夜过后我很难计算时间: String time = "15:00-18:05"; //Calculating OK //String time = "22:00-01:05"; //Not
我使用 XML 从 MySQL 数据库中抓取了两个日期,如下所示。我想获得以秒为单位的时差。 我写了这个脚本,但它给出了“NaN” function show(){ var t1 = new Dat
如何在 MYSQL phpMyAdmin 数据库中以 (TIME 00:00:00) 格式更新另一个字段(整列)的时间差 当我在 PHP 中执行此操作时,我不断收到 0:00:00 并且没有结果。其
我的表单中有两个字段,用户可以在其中选择输入时间(开始时间、结束时间),我想在更改这些字段时重新计算另一个字段的值。 我想做的是获取 2 次之间的小时数。因此,例如,如果我的开始时间为 5:30,结束
我想使用 Date 和 Calendar 类计算 java 中两个日期/时间之间的差异。我的格式是“2012-01-24 12:30:00 PM”。 我已经实现了我自己的方法,也用谷歌搜索它以与其他人
MySQL 服务器上的访客数据库如下所示id 是主键整数类型,firstname 和 lastname 是文本类型,访客 id 是整数类型 id firstname lastname
我是一名优秀的程序员,十分优秀!