Linux приложение для чтения пакетов из необработанного сокета прекращает прием пакетов через некоторое время - PullRequest
0 голосов
/ 04 мая 2020

Я написал прикладную программу Linux, которая принимает UDP-пакеты, передаваемые с рабочего стола с фиксированным и известным IP-адресом в сети. Я использую необработанный сокет для получения пакетов в моей системе и фильтрации полученных пакетов на основе адреса источника.

Проблема, с которой я сталкиваюсь, заключается в том, что программа некоторое время работает нормально, и я получаю все необходимые пакеты , но через пару часов приложение перестает получать какие-либо пакеты. Если я запускаю команду tcpdump -i eth0 src 192.168.20.48 в моей системе, то вижу, что система продолжает получать ожидаемые пакеты. Но я не уверен, что приводит к тому, что моя программа перестает получать пакеты.

Ниже приведен фрагмент кода, используемый для открытия необработанного сокета, получения пакетов и фильтрации пакетов UDP, передаваемых с известного IP-адреса.

int main()
{
    int sockfd;
    int one = 1;
    struct timeval tv;
    socklen_t len;
    int bytes;
    unsigned char tsptr[2048];
    struct sockaddr_in cliaddr;
    struct iphdr *iph;
    int result=0;
    char source_add[50];
    char expected_source_add[50];

    len = sizeof(struct sockaddr_in);

    // Creating socket file descriptor
    if ((sockfd = socket(AF_INET , SOCK_RAW , IPPROTO_UDP)) < 0 ) {
      BRH_PERROR("socket creation failed");
      return 1;
    }

    tv.tv_sec = 30;
    tv.tv_usec = 0;

    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR|SO_REUSEPORT, &one, sizeof(one));
    setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO,(char*)&tv,sizeof(tv));

    strcpy(expected_source_add, "192.168.20.48");

    while (1) {
        /*Read fixed data count from socket*/
        bytes =recvfrom(sockfd, tsptr, 1500, MSG_WAITALL, (struct sockaddr *)&cliaddr, &len);

        iph=(struct iphdr*)tsptr;

        //get only UDP packet
        if (iph->protocol != 17) continue;

        strcpy(source_add,inet_ntoa(cliaddr.sin_addr));

        result = strcmp(expected_source_add,source_add);

        /*receive data from expected IP address only*/
        if( result == 0) {
            //Consume the packet
        }
    }

    return 0;
}

Любая подсказка о том, почему прием пакетов останавливается в моем приложении, даже если tcpdump показывает, что пакеты принимаются на интерфейсе, будет полезна.

1 Ответ

0 голосов
/ 05 мая 2020

Код, который вы пишете здесь, не может увидеть любую проблему, которую вы описываете, я думаю, вы должны сделать что-то вроде ниже. 1. используя wireshark или tcpdump, чтобы проверить, успешно ли ni c принимает пакеты. 2. за пределами программы. Используете ли вы какой-либо буфер или очередь сообщений, и они работают хорошо? 3. использование инструментов, чтобы увидеть, есть ли утечка памяти 4. запись журнала на каждом шаге, особенно вокруг recvefrom и strcmp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...