Преобразуйте {ipv6 или ip4 или имя домена} с указанным портом в struct sockaddr - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь создать обобщенную c функцию для отправки некоторых двоичных данных в где-то с использованием сокетов UDP. Поэтому char* destination может иметь любую из следующих форм:

"ab c .d"

"a: b: c: d: e: f: g: h "

" example.com "

и char* data может содержать '\ 0', но не гарантированно завершается нулем.

int sendData(const char* destination, uint16_t port, int socket, const char* data, uint32_t data_size)
{
    struct sockaddr dest;
    dest.sin_port = htons(port);

    int sent_bytes = sendto(socket, data, data_size, 0, &dest, sizeof(sockaddr));

    if (sent_bytes != data_size){
        printf("failed to send packet (%d/%d)\n", sent_bytes, data_size);
        perror("sendto");
        return 1;
    }
    else {
        return 0;
    }
}

Но я не понимаю Не знаю, как превратить char* destination в sockaddr, и быстрый поиск моего вопроса дал только ответы для ipv4 или наоборот (преобразование sockaddr в строку, а это НЕ то, что я хочу). Я не уверен, что искать и где искать, и любая помощь будет высоко ценится.

Я видел, как люди упоминают "getaddrinfo" и "getnameinfo", но я не уверен, что это функции делают, и никто не публикует никаких примеров - они просто говорят «используйте это». Быстрый поиск, похоже, возвращает, что это не те функции, которые я ищу, потому что они возвращают struct addr_info, который вы не можете поместить в сокет.

1 Ответ

2 голосов
/ 16 марта 2020

Я видел, как люди упоминают "getaddrinfo" и "getnameinfo", но я не уверен, что эти функции делают, и никто не публикует никаких примеров.

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

Похоже, быстрый поиск вернул, что это не те функции, которые я ищите, потому что они возвращают struct addr_info, которую вы не можете поместить в сокет.

Из той же самой записи в Википедии :

struct addrinfo {
    ...
    struct    sockaddr* ai_addr;
    ...
};

Итак, очевидно, что struct sockaddr, который вы хотите получить, действительно существует, если вы сделаете чуть-чуть больше, чем быстрый поиск и посмотрите на реальные детали struct addrinfo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...