#1
|
|||
|
|||
listen и IPv6
Evgeny Chevtaev написал(а) к All в Jun 21 05:29:40 по местному времени:
Нi All! Кто-нибудь знает, в каком виде в директиве listen указывать IPv6-адрес? Это я про конфиг эхотага, конечно же... Если указывать как есть, то он считает, что всё после первого двоеточия есть порт: ? 04 Jun 04:56:50 [915] e2c0:574:5555:f1d0:2:5010:275: incorrect port (getaddrinfo: Service was not recognized for socket type) ? 04 Jun 04:56:50 [915] e2c0:574:5555:f1d0:2:5010:275: bad port number Если указывать в квадратных скобках, то пытается ресолвить: ? 04 Jun 05:17:21 [1767] servmgr getaddrinfo: Name does not resolve (8) Пока что прописал в hosts буквенное имя для адреса и сказал слушать его. With best regards, Evgeny --- GoldED+/BSD 1.1.5-b20180707 |
#2
|
|||
|
|||
listen и IPv6
Nil A написал(а) к Evgeny Chevtaev в Jun 21 06:47:56 по местному времени:
Нello, Evgeny! Friday June 04 2021 05:29, from Evgeny Chevtaev -> All: EC> Кто-нибудь знает, в каком виде в директиве listen указывать EC> IPv6-адрес? Это я про конфиг эхотага, конечно же... В директиве listen адрес IPv6 пишется в квадратных скобках [], и также опционально можно задать порт через двоеточие. EC> Если указывать как есть, то он считает, что всё после первого EC> двоеточия есть порт: Поэтому парсер binkd конфига и ищет '[', чтобы понять, что это IPv6, в котором двоеточие является частью адреса. EC> Если указывать в квадратных скобках, то пытается ресолвить: EC> ? 04 Jun 05:17:21 [1767] servmgr getaddrinfo: Name does not resolve EC> (8) Мой getaddrinfo() из линксового glibc отбраковывает адрес указанный вместе со скобочками []. Я не знаю, как у других это работает. Далее идёт мой патч, который выкидывает скобочки из адреса IPv6, и в таком виде у меня getaddrinfo() работает как ожидается. -+- a/readcfg.c +++ b/readcfg.c @@ -1650,12 +1650,13 @@ static int read_listen (KEYWORD key, int wordcount, char *words) new_entry.port[0] = '\0'; if (words[i][0] == '[') { / IPv6 / - p = strchr(words[i], ']'); - if (p && p[1] == ':') + strncpy(newentry.addr, words[i]+1, sizeof(newentry.addr)); + p = strchr(new_entry.addr, ']'); + if (p) { - snprintf(newentry.port, sizeof(newentry.port), "%s", p + 2); - p = strchr(new_entry.addr, ']'); - if (p) p[1] = '\0'; + p[0] = '\0'; + if (p[1] == ':') + snprintf(newentry.port, sizeof(newentry.port), "%s", p + 2); } } else if ((p = strchr(words[i], ':')) != NULL) { Ещё надо бы увеличить буфер для адреса, а то IPv6 адреса могут быть длинными, особенно если ещё порт указать. -+- a/readcfg.h +++ b/readcfg.h @@ -54,7 +54,7 @@ struct akachain struct listenchain { struct listenchain *next; - char addr[42]; + char addr[256]; char port[MAXSERVNAME + 1]; }; #if defined(WITНZLIB) || defined(WITНBZLIB2) Best Regards, Nil --- GoldED+/LNX 1.1.5 |
#3
|
|||
|
|||
listen и IPv6
Nil A написал(а) к Evgeny Chevtaev в Jun 21 06:59:34 по местному времени:
Нello, Evgeny! Friday June 04 2021 05:29, from Evgeny Chevtaev -> All: EC> Кто-нибудь знает, в каком виде в директиве listen указывать EC> IPv6-адрес? Это я про конфиг эхотага, конечно же... В директиве listen адрес IPv6 пишется в квадратных скобках [], и также опционально можно задать порт через двоеточие. EC> Если указывать как есть, то он считает, что всё после первого EC> двоеточия есть порт: Поэтому парсер binkd конфига и ищет '[', чтобы понять, что это IPv6, в котором двоеточие является частью адреса. EC> Если указывать в квадратных скобках, то пытается ресолвить: EC> ? 04 Jun 05:17:21 [1767] servmgr getaddrinfo: Name does not resolve EC> (8) Мой getaddrinfo() из линксового glibc отбраковывает адрес указанный вместе со скобочками []. Я не знаю, как у других это работает. Далее идёт мой патч, который выкидывает скобочки из адреса IPv6, и в таком виде у меня getaddrinfo() работает как ожидается. -+- a/readcfg.c +++ b/readcfg.c @@ -1650,12 +1650,14 @@ static int read_listen (KEYWORD key, int wordcount, char *words) new_entry.port[0] = '\0'; if (words[i][0] == '[') { / IPv6 / - p = strchr(words[i], ']'); - if (p && p[1] == ':') + strncpy(newentry.addr, words[i]+1, sizeof(newentry.addr)); + newentry.addr[sizeof(newentry.addr)-1] = '\0'; + p = strchr(new_entry.addr, ']'); + if (p) { - snprintf(newentry.port, sizeof(newentry.port), "%s", p + 2); - p = strchr(new_entry.addr, ']'); - if (p) p[1] = '\0'; + p[0] = '\0'; + if (p[1] == ':') + snprintf(newentry.port, sizeof(newentry.port), "%s", p + 2); } } else if ((p = strchr(words[i], ':')) != NULL) { Ещё надо бы увеличить буфер для адреса, а то IPv6 адреса могут быть длинными, особенно если ещё порт указать. -+- a/readcfg.h +++ b/readcfg.h @@ -54,7 +54,7 @@ struct akachain struct listenchain { struct listenchain *next; - char addr[42]; + char addr[256]; char port[MAXSERVNAME + 1]; }; #if defined(WITНZLIB) || defined(WITНBZLIB2) Best Regards, Nil --- GoldED+/LNX 1.1.5 |
#4
|
|||
|
|||
listen и IPv6
Evgeny Chevtaev написал(а) к Nil A в Jun 21 13:03:26 по местному времени:
Нi Nil! Friday June 04 2021 06:47, Nil A wrote to Evgeny Chevtaev: EC>> Если указывать в квадратных скобках, то пытается ресолвить: EC>> ? 04 Jun 05:17:21 [1767] servmgr getaddrinfo: Name does not EC>> resolve (8) NA> Мой getaddrinfo() из линксового glibc отбраковывает адрес указанный NA> вместе со скобочками []. Я не знаю, как у других это работает. NA> Далее идёт мой патч, который выкидывает скобочки из адреса IPv6, и в NA> таком виде у меня getaddrinfo() работает как ожидается. Во, с этим патчем заработало! NA> Ещё надо бы увеличить буфер для адреса, а то IPv6 адреса могут быть NA> длинными, особенно если ещё порт указать. NA> - char addr[42]; Видимо, расчёт был такой, что 42 - это 8 групп по 4 символа, разделённых 7 двоеточиями, в 2 квадратных скобках и в конце \0. ;) А порт забыли. With best regards, Evgeny --- GoldED+/BSD 1.1.5-b20180707 |
#5
|
|||
|
|||
listen и IPv6
Alexey Vissarionov написал(а) к Evgeny Chevtaev в Jun 21 11:22:22 по местному времени:
Доброго времени суток, Evgeny! 04 Jun 2021 13:03:26, ты -> Nil A: NA>> Ещё надо бы увеличить буфер для адреса, а то IPv6 адреса могут быть NA>> длинными, особенно если ещё порт указать. NA>> - char addr[42]; EC> Видимо, расчёт был такой, что 42 - это 8 групп по 4 символа, EC> разделённых 7 двоеточиями, в 2 квадратных скобках и в конце \0. ;) EC> А порт забыли. + uint8_t addr[48]; Не надо использовать char для байтов. Да, уже сейчас. А uint16_t в 5 десятичных цифр заведомо укладывается. -- Alexey V. Vissarionov aka Gremlin from Kremlin gremlin ПРИ gremlin ТЧК ru; +vii-cmiii-ccxxix-lxxix-xlii ... Не рой другому яму - перебьешь свой кабель --- /bin/vi |