Я написал прикладную программу 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 показывает, что пакеты принимаются на интерфейсе, будет полезна.