Nano Hash - криптовалюты, майнинг, программирование

'inet_pton': идентификатор не найден

Я пытаюсь включить следующий код в свою программу, но появляется ошибка ('inet_pton': идентификатор не найден).

// IPv4:

struct sockaddr_in ip4addr;
int s;

ip4addr.sin_family = AF_INET;
ip4addr.sin_port = htons(3490);
inet_pton(AF_INET, "10.0.0.1", &ip4addr.sin_addr);

s = socket(PF_INET, SOCK_STREAM, 0);
bind(s, (struct sockaddr*)&ip4addr, sizeof ip4addr);

Выход

 error C3861: 'inet_pton': identifier not found

включая заголовок

 #include <stdio.h>
 #include <stdlib.h>
 #include "udpDefine.h"
 #include <windows.h>

любая помощь может быть пропущена в некоторых заголовках или lib.


  • Быстрый поиск в Google выдает #include ‹arpa/inet.h› 27.03.2013
  • Фатальная ошибка @H2CO3 C1083: Не удается открыть включаемый файл: 'arpa/inet.h': Нет такого файла или каталога. мне нужно установить дополнительные заголовки или что? 27.03.2013
  • Вы указали путь к включаемым файлам? 27.03.2013
  • @abdo.eng2006210 Этот заголовочный файл является частью стандартной библиотеки (по крайней мере, согласно POSIX). Если у вас его нет, то Windows просто не предоставляет эту функцию, что неудивительно — Windows не совместима с POSIX. 27.03.2013
  • @abdo.eng2006210 см. мою правку 27.03.2013
  • @H2CO3 моя операционная система - Windows 7. ‹arpa/inet.h› не предоставляется в Windows или отсутствует в моей системе. 27.03.2013
  • @abdo.eng2006210 Я не знаю, я не использую/не программирую для Windows, все, что я могу сказать, я действительно не удивлюсь, если его не существует. Я не знаю, почему вы считаете вашу систему особенной. 27.03.2013

Ответы:


1

функция

int inet_pton(int af, const char *src, void *dst);

объявляется в заголовочном файле:

#include <arpa/inet.h>

если это Windows (Vista или более поздняя версия), существует аналог Winsock для этой версии ANSI:

INT WSAAPI InetPton(
  _In_   INT  Family,
  _In_   PCTSTR pszAddrString,
  _Out_  PVOID pAddrBuf
);

попробуйте #include <Ws2tcpip.h> добавить Ws2_32.lib

27.03.2013
  • я включил ‹winsock.h› и изменил оператор на InetPton(AF_INET, 192.168.10.9, &address.sin_addr); и ошибка была (ошибка C3861: 'InetPton': идентификатор не найден) 27.03.2013
  • @abdo.eng2006210 добавить библиотеку Ws2_32.lib 27.03.2013
  • @abdo.eng2006210 включить Ws2tcpip.h вместо winsock 27.03.2013
  • Обратите внимание, что определения в Ws2tcpip.h находятся внутри блока #if (NTDDI_VERSION ›= NTDDI_VISTA) / ... / #endif. Вам может потребоваться установить NTDDI_VERSION и _WIN32_WINNT соответственно в зависимости от вашей среды сборки. 26.10.2017

  • 2

    В Windows XP (и более поздних версиях) вы можете использовать следующие функции:

    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>    
    
    #include <winsock2.h>
    #include <ws2tcpip.h>
    
    
    int inet_pton(int af, const char *src, void *dst)
    {
      struct sockaddr_storage ss;
      int size = sizeof(ss);
      char src_copy[INET6_ADDRSTRLEN+1];
    
      ZeroMemory(&ss, sizeof(ss));
      /* stupid non-const API */
      strncpy (src_copy, src, INET6_ADDRSTRLEN+1);
      src_copy[INET6_ADDRSTRLEN] = 0;
    
      if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) {
        switch(af) {
          case AF_INET:
        *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr;
        return 1;
          case AF_INET6:
        *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr;
        return 1;
        }
      }
      return 0;
    }
    
    const char *inet_ntop(int af, const void *src, char *dst, socklen_t size)
    {
      struct sockaddr_storage ss;
      unsigned long s = size;
    
      ZeroMemory(&ss, sizeof(ss));
      ss.ss_family = af;
    
      switch(af) {
        case AF_INET:
          ((struct sockaddr_in *)&ss)->sin_addr = *(struct in_addr *)src;
          break;
        case AF_INET6:
          ((struct sockaddr_in6 *)&ss)->sin6_addr = *(struct in6_addr *)src;
          break;
        default:
          return NULL;
      }
      /* cannot direclty use &size because of strict aliasing rules */
      return (WSAAddressToString((struct sockaddr *)&ss, sizeof(ss), NULL, dst, &s) == 0)?
              dst : NULL;
    }
    

    Ссылка с библиотекой ws2_32.

    28.12.2013
  • +1 в INET6_ADDRSTRLEN+1 (или INET_ADDRSTRLEN+1) не нужен. Комментарии в заголовках Microsoft указывают, что определение включает завершающий NULL. 10.10.2016

  • 3

    Пользователи Windows также могут найти ответ здесь:

    https://docs.microsoft.com/en-us/windows/desktop/api/ws2tcpip/nf-ws2tcpip-inetptonw

    Функция InetPton преобразует адрес сети Интернет IPv4 или IPv6 в стандартной текстовой форме представления в числовую двоичную форму. Версия этой функции ANSI — inet_pton.

    Функция InetPton поддерживается в Windows Vista и более поздних версиях.

    Когда UNICODE или _UNICODE не определены, InetPton определяется как InetPtonA, версия этой функции ANSI. Версия ANSI этой функции всегда определяется как inet_pton.

    Header      ws2tcpip.h
    Library     Ws2_32.lib
    DLL         Ws2_32.dll
    

    Вам нужно использовать заголовок ws2tcpip.h и добавить Ws2_32.lib к вашему компоновщику.

    19.07.2018
  • Ссылка на решение приветствуется, но убедитесь, что ваш ответ полезен и без нее: добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели некоторое представление о том, что это такое и почему оно здесь, а затем процитируйте наиболее релевантную часть страницы, на которую вы ссылаетесь. на случай, если целевая страница недоступна. Ответы, которые немного больше, чем ссылка, могут быть удалены. 19.07.2018
  • @Hearen отредактировано. 12.09.2018

  • 4

    В моем случае функцию найти не удалось, потому что в заголовочном файле было "#define WINVER 0x0502".

    В системах Windows для этой функции требуется версия 0x600 (= Vista).

    25.10.2016

    5

    В WS2tcpip.h определен этот API inet_pton:

    #if (NTDDI_VERSION >= NTDDI_VISTA)
    WINSOCK_API_LINKAGE
    INT
    WSAAPI
    inet_pton(
        _In_                                      INT             Family,
        _In_                                      PCSTR           pszAddrString,
        _When_(Family == AF_INET, _Out_writes_bytes_(sizeof(IN_ADDR)))
        _When_(Family == AF_INET6, _Out_writes_bytes_(sizeof(IN6_ADDR)))
                                                  PVOID           pAddrBuf
        );
    
    30.07.2019

    6

    Декларируйте эту функцию явно в вашем коде.

    int inet_pton(int af, const char *src, void *dst)
    {
      struct sockaddr_storage ss;
      int size = sizeof(ss);
      char src_copy[INET6_ADDRSTRLEN+1];
    
      ZeroMemory(&ss, sizeof(ss));
      /* stupid non-const API */
      strncpy (src_copy, src, INET6_ADDRSTRLEN+1);
      src_copy[INET6_ADDRSTRLEN] = 0;
    
      if (WSAStringToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) {
        switch(af) {
          case AF_INET:
        *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr;
        return 1;
          case AF_INET6:
        *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr;
        return 1;
        }
      }
      return 0;
    } 
    
    20.05.2020

    7

    Чтобы решить эту проблему, просто добавьте следующее в свой код после всех #includes

    #pragma comment(lib, "ws2_32.lib")
    
    21.03.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..