2016-06-28 1 views
0

«recvfrom()» в приведенном ниже примере кода ожидает, пока не будет получен пакет UDP.Как проверить, получен ли пакет UDP в C Linux

Но мне нужно проверить, доступен ли пакет UDP или нет. Если пакет не получен, продолжите другие задачи. Если пакет принят, тогда получите пакет и разбор. Как это сделать в программе Linux c? Пожалуйста помоги!

for (;;) 
{ 
    printf("waiting on port %d\n", SERVICE_PORT); 
    recvlen = recvfrom(fd, buf, BUFSIZE, 0, (struct sockaddr *)&remaddr, &addrlen); 
    printf("received %d bytes\n", recvlen); 
    if (recvlen > 0) { 
     buf[recvlen] = 0; 
     printf("received message: \"%s\"\n", buf); 
    } 
} 
+1

Вы можете использовать ('select') [linux.die.net/man/2/select] функцию, чтобы знать, что что-то готово к чтению в сокете. – purplepsycho

+0

есть выбор работающий. Спасибо. – Brian

ответ

2

Вы можете использовать функцию select, чтобы знать, что что-то готово для чтения на сокете.

while (1) 
{ 
    int retval; 
    fd_set rfds; 
    // one second timeout 
    struct timeval tv = {1,0}; 

    FD_ZERO(&rfds); 
    FD_SET(fd, &rfds); 

    retval = select(1, &rfds, NULL, NULL, &tv); 

    if (retval == -1) 
    { 
     perror("select()"); 
     exit(1); 
    }   
    else if (retval) 
    { 
     printf("Data is available now.\n");  
    } 
    else 
    { 
     // no data to read... perform other tasks 
    } 
} 
+0

есть выбор работающий. Спасибо. – Brian

0

Вы можете подождать определенные секунды в коде. Если вы не получили пакет в течение этого времени, попросите его продолжить процесс. Или проверьте возвращаемое значение recvfrom, чтобы проверить полученный размер пакета.