Ошибка возврата функции Sendto — UDP-сокет в Windows

У меня проблема с функцией 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 и как я могу это исправить?

0

Решение

Старый ответ (приведенный ниже) носит информационный характер, но не подходит для этого случая.

Проблема скорее всего в этих двух строчках

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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]