Не дожидаться ответа от udp сервера

Нашел в интернете такой код, здесь происходит отправка введенного сообщения на udp сервер. В моем случае 8.8.8.8. Все хорошо но если отправить пакет на не существующий ip программа уходит в ожидание ответа на всегда.

int send_udp(){
    



    
    struct sockaddr_in si_other;
    int s, slen=sizeof(si_other);
    char buf[BUFLEN];
    char message[BUFLEN];
    WSADATA wsa;

    //Initialise winsock
    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d",WSAGetLastError());
        exit(EXIT_FAILURE);
    }
    printf("Initialised.\n");
    
    //create socket
    if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
    {
        printf("socket() failed with error code : %d" , WSAGetLastError());
        exit(EXIT_FAILURE);
    }
    
    //setup address structure
    memset((char *) &si_other, 0, sizeof(si_other));
    si_other.sin_family = AF_INET;
    si_other.sin_port = htons(53);
    si_other.sin_addr.S_un.S_addr = inet_addr("8.8.8.8");
    
    //start communication
    //while(1)
    //{
        printf("Enter message : ");
        gets(message);
        
        //send the message
        if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen) == SOCKET_ERROR)
        {
            printf("sendto() failed with error code : %d" , WSAGetLastError());
            exit(EXIT_FAILURE);
        }
        
        //receive a reply and print it
        //clear the buffer by filling null, it might have previously received data
        memset(buf,'\0', BUFLEN);
        //try to receive some data, this is a blocking call
        
        
        




        if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == SOCKET_ERROR)
        {
            printf("recvfrom() failed with error code : %d" , WSAGetLastError());
            exit(EXIT_FAILURE);
        }
        
        puts(buf);
    //}

    closesocket(s);
    WSACleanup();

    return 0;
}

Как можно сделать ожидание ответа от сервера несколько секунд?


Ответы (1 шт):

Автор решения: VAntonuk

Уже не помню как работает winsock, но советую почитать об ассинхронном программировании или посмотреть лекции на канале "Разработка" , операциях, блокирующих поток В синхронном программировании поток встает в режим ожидания ответа Советую ознакомиться с Boost::Asio Ассинхронный ввод-вывод В таком случае в коде можно выполнять операции во время ожидания ответа

В случае несуществующего Ip в winapi есть функция проверяющая возможность соединения InternetCheckConnection

→ Ссылка