Разница во времени закрытия AF_PACKET против AF_INET? - PullRequest
2 голосов
/ 21 мая 2019

В чем причина такой разницы во времени между закрывающими сокетами, созданными как 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;
}

1 Ответ

1 голос
/ 22 мая 2019

Логически несущественная разница для обоих системных вызовов

Если я изменю вашу программу, как показано ниже,

`

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 

вывод: По сути, первый закрытый звонок занимает больше времени, возможно, требуется время для отображения функции системного вызова впервые .

...