Не дожидаться ответа от 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 шт):
Уже не помню как работает winsock, но советую почитать об ассинхронном программировании или посмотреть лекции на канале "Разработка" , операциях, блокирующих поток В синхронном программировании поток встает в режим ожидания ответа Советую ознакомиться с Boost::Asio Ассинхронный ввод-вывод В таком случае в коде можно выполнять операции во время ожидания ответа
В случае несуществующего Ip в winapi есть функция проверяющая возможность соединения InternetCheckConnection