странность винсок (с ++) - PullRequest
1 голос
/ 13 февраля 2009

Я пытаюсь реализовать функцию с именем "inet_pton", которая преобразует строковое представление IPv4 или IPv6 (например, "66.102.1.147" [google]) в двоичную упорядоченную байтовую сеть. Вот соответствующая часть моего кода:

#if defined WIN32
int inet_pton (int af, const char *src, void *dst)

{
    const void *data;
    size_t      len;
    struct      addrinfo hints, *res;

    hints.ai_family   = af;
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_UDP;
    hints.ai_flags    = AI_NUMERICHOST;

    if (getaddrinfo (src, NULL, &hints, &res))
    {
        std::cout << "ERROR : inet_pton() in " << __FILE__ << " at line " << __LINE__ << std::endl;
        std::cout << "      : getaddrinfo() failed to get IP address info for \"" << src << "\"" << std::endl;
        return 0;
    }
...

Таким образом, src является входящей строкой IP. Тем не менее, я всегда получаю сообщение об ошибке типа

getaddrinfo () не смог получить информацию об IP-адресе для "66.102.1.147"

Может ли кто-нибудь с опытом работы с winsock прокомментировать? Я также попробовал другой метод, функция

WSAStringToAddress ((LPTSTR)src, af, NULL, (LPSOCKADDR) &sa, &address_length)

Но он всегда возвращает код ошибки WSAEINVAL, указывающий неверную строку IP. Это не имеет смысла для меня. Я использую VS2005 в качестве моей IDE.

Ответы [ 4 ]

4 голосов
/ 13 февраля 2009

Ну, для начала вы запрашиваете сокет потока с протоколом UDP, а этого просто не произойдет.

Попробуйте с:

hints.ai_family   = af;
hints.ai_socktype = 0; 
hints.ai_protocol = 0;
hints.ai_flags    = AI_NUMERICHOST;

и memset сначала обнуляет его, так как у него есть дополнительные элементы, которые вы не устанавливаете ...

Также в моем коде я передаю пустую строку для порта или службы, когда у меня ее нет, а не ноль. Документы не указывают, что делать, если у вас нет значения; но в любом случае у меня работает пустая строка.

О, и как всегда в этих ситуациях, было бы полезно узнать, какое значение WSAGetLastError () возвращает ...

2 голосов
/ 13 февраля 2009

Какое значение вы передаете аф? У меня есть некоторый код, чтобы сделать то же самое, и единственное различие между моим и вашим:

  • Я установил структуру подсказок на 0
  • Я всегда передаю PF_UNSPEC для ai_family
  • Я использую IPPROTO_TCP вместо IPPROTO_UDP.
2 голосов
/ 13 февраля 2009

В MSDN есть отличная статья об использовании getaddrinfo:

http://msdn.microsoft.com/en-us/library/ms738520(VS.85).aspx

Существует даже пример использования AI_NUMERICHOST, который звучит так, как вам нужно. Они настраивают свою структуру "подсказок" немного иначе, чем вы:

ZeroMemory(&hints, sizeof(hints));
hints.ai_flags = AI_NUMERICHOST;
hints.ai_family = AF_UNSPEC;

Они не устанавливают другие 2 свойства. Может быть, это поможет?

1 голос
/ 13 февраля 2009

Вы также можете использовать libcurl в качестве ссылки. изобретать велосипед не всегда нужно.

...