Intereting Posts
Можно ли предусмотреть препроцессор в макросе C? Возможно ли LD_PRELOAD использовать функцию с разными параметрами? Есть ли разница между unsigned и unsigned int Можно ли предположить, что указатель представляет собой размер int в C? Почему VS2010 дает синтаксические ошибки, когда синтаксис верен? Это неопределенное поведение в C? Если не outlookировать выход логически Почему передача символа в функцию меняет значение в c? Ограничение стандартного ввода-вывода C и почему мы не можем использовать стандартный ввод-вывод C с сокетами Почему требуется выравнивание памяти? Сколько страниц памяти используют компиляторы C на настольных ОС для обнаружения переполнения стека? Как вы используете offsetof () в структуре? for (unsigned char i = 0; i <= 0xff; i ++) создает бесконечный цикл Простая библиотека изображений C? Отпечатать ответ вызова метода Dbus на C Простой HTTP-сервер с использованием fork и dup

Как использовать inet_pton () с компилятором mingw?

Я пытаюсь добавить совместимость IPv6 к уже совместимой с IPv4 программе на C, но имею некоторые проблемы с компилятором. В настоящее время компиляция с mingw32-gcc-4.6.2, которая дает мне ошибку связывания при использовании функции inet_pton.

Я попытался сделать его компиляцией для vista (поскольку inet_pton – это функция vista), но кажется, что вся функция отсутствует в mingw.

Есть ли способ добавить его в mingw или любые другие варианты, которые я, возможно, пропустил?

Глядя в мои прошлые коды – Проверено в MinGW / GCC:

int inet_pton(int af, const char *src, char *dst) { switch (af) { case AF_INET: return inet_pton4(src, dst); case AF_INET6: return inet_pton6(src, dst); default: return -1; } } 

..

 #define NS_INADDRSZ 4 #define NS_IN6ADDRSZ 16 #define NS_INT16SZ 2 

..

 int inet_pton4(const char *src, char *dst) { uint8_t tmp[NS_INADDRSZ], *tp; int saw_digit = 0; int octets = 0; *(tp = tmp) = 0; int ch; while ((ch = *src++) != '\0') { if (ch >= '0' && ch <= '9') { uint32_t n = *tp * 10 + (ch - '0'); if (saw_digit && *tp == 0) return 0; if (n > 255) return 0; *tp = n; if (!saw_digit) { if (++octets > 4) return 0; saw_digit = 1; } } else if (ch == '.' && saw_digit) { if (octets == 4) return 0; *++tp = 0; saw_digit = 0; } else return 0; } if (octets < 4) return 0; memcpy(dst, tmp, NS_INADDRSZ); return 1; } 

...

 int inet_pton6(const char *src, char *dst) { static const char xdigits[] = "0123456789abcdef"; uint8_t tmp[NS_IN6ADDRSZ]; uint8_t *tp = (uint8_t*) memset(tmp, '\0', NS_IN6ADDRSZ); uint8_t *endp = tp + NS_IN6ADDRSZ; uint8_t *colonp = NULL; /* Leading :: requires some special handling. */ if (*src == ':') { if (*++src != ':') return 0; } const char *curtok = src; int saw_xdigit = 0; uint32_t val = 0; int ch; while ((ch = tolower(*src++)) != '\0') { const char *pch = strchr(xdigits, ch); if (pch != NULL) { val <<= 4; val |= (pch - xdigits); if (val > 0xffff) return 0; saw_xdigit = 1; continue; } if (ch == ':') { curtok = src; if (!saw_xdigit) { if (colonp) return 0; colonp = tp; continue; } else if (*src == '\0') { return 0; } if (tp + NS_INT16SZ > endp) return 0; *tp++ = (uint8_t) (val >> 8) & 0xff; *tp++ = (uint8_t) val & 0xff; saw_xdigit = 0; val = 0; continue; } if (ch == '.' && ((tp + NS_INADDRSZ) <= endp) && inet_pton4(curtok, (char*) tp) > 0) { tp += NS_INADDRSZ; saw_xdigit = 0; break; /* '\0' was seen by inet_pton4(). */ } return 0; } if (saw_xdigit) { if (tp + NS_INT16SZ > endp) return 0; *tp++ = (uint8_t) (val >> 8) & 0xff; *tp++ = (uint8_t) val & 0xff; } if (colonp != NULL) { /* * Since some memmove()'s erroneously fail to handle * overlapping regions, we'll do the shift by hand. */ const int n = tp - colonp; if (tp == endp) return 0; for (int i = 1; i <= n; i++) { endp[-i] = colonp[n - i]; colonp[n - i] = 0; } tp = endp; } if (tp != endp) return 0; memcpy(dst, tmp, NS_IN6ADDRSZ); return 1; } 

Автор: Пол Викси, 1996.