У меня проблема с функцией sendto. Я хочу получить время с сервера UDP. Мой код такой:
unsigned char msg[48]={010,0,0,0,0,0,0,0,0};
char* hostname=(char *)"tick.usno.navy.mil";
sockaddr_in server_addr;
WSAData data;
int result=WSAStartup( MAKEWORD( 2, 2 ), &data );
if (result != NO_ERROR) {
printf("WSAStartup failed with error: %d\n", result);
return 1;
}
int client_s = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP);
if (client_s == INVALID_SOCKET) {
printf("socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
unsigned short Port = 123;
server_addr.sin_family = AF_INET; // Address family to use
server_addr.sin_port = htons(Port); // Port num to use
server_addr.sin_addr.s_addr = inet_addr(hostname); // IP address to use
char out_buf[BUFFER_SIZE];
int retcode = sendto(client_s, reinterpret_cast<const char*>(msg), sizeof(msg), 0,(struct sockaddr *)&server_addr, sizeof(server_addr));
perror("sendto:");
if (retcode == SOCKET_ERROR) {
printf("sendto failed with error: %d\n", WSAGetLastError());
closesocket(client_s);
WSACleanup();
return 1;
}
Мой вывод похож на:
sendto:: No error
sendto failed with error: 10013
Когда я пытаюсь получить данные с помощью recv, у меня что-то не так. Я хочу получить время с сервера UDP на Windows с C ++. Где здесь проблема? Почему одна ошибка говорит об отсутствии ошибки, а одна ошибка 10013 и как я могу это исправить?
Старый ответ (приведенный ниже) носит информационный характер, но не подходит для этого случая.
Проблема скорее всего в этих двух строчках
char* hostname=(char *)"tick.usno.navy.mil";
...
server_addr.sin_addr.s_addr = inet_addr(hostname); // IP address to use
inet_addr
Функция ожидает десятичный IPv4-адрес с точками. Не неразрешенное имя хоста. Если указан неправильный десятичный десятичный IPv4-адрес, функция вернет INADDR_NONE
который не является действительным адресом и приведет к проблемам при использовании адреса, например, в. sendto
, Это приведет к ошибке, указанной в вопросе? Я, честно говоря, не знаю, но это определенно не будет работать, как ожидалось.
Чтобы преобразовать имя хоста в IP-адрес, вы должны использовать getaddrinfo
. Ссылочная ссылка также содержит пример того, как ее использовать.
Ошибка 10013
есть, если вы посмотрите, например, на это ссылка на ошибку Windows Socket WSAEACCESS
, что есть некоторые проблемы с разрешением. Если вы будете искать немного, вы увидите, что порты под 1024
зарезервированы для системы, и вам нужны повышенные привилегии для их использования.
Если вы хотите создать NTP-сервер или клиент, вам нужно запустить свою программу с использованием повышенных прав доступа, например, например. используя «Запуск от имени администратора».
Что касается сообщения
sendto :: Нет ошибок
это исходит от perror
позвонить вам безоговорочно позвонить после sendto
, Прежде всего, в Windows функции сокета не устанавливаются errno
который perror
использует. Во-вторых, состояние errno
не определено, если предыдущий вызов на самом деле не потерпел неудачу.
Так что не используйте его безусловно и не используйте его для функций сокетов Windows.
Других решений пока нет …