forum.wfido.ru  

Вернуться   forum.wfido.ru > Прочие эхи > RU.BINKD

Ответ
 
Опции темы Опции просмотра
  #1  
Старый 04.06.2021, 04:42
Evgeny Chevtaev
Guest
 
Сообщений: n/a
По умолчанию 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  
Старый 04.06.2021, 08:03
Nil A
Guest
 
Сообщений: n/a
По умолчанию 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  
Старый 04.06.2021, 08:15
Nil A
Guest
 
Сообщений: n/a
По умолчанию 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  
Старый 04.06.2021, 12:14
Evgeny Chevtaev
Guest
 
Сообщений: n/a
По умолчанию 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  
Старый 04.06.2021, 12:35
Alexey Vissarionov
Guest
 
Сообщений: n/a
По умолчанию 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
Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 19:29. Часовой пояс GMT +4.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot