Тема: IPv6 & IPv4
Показать сообщение отдельно
  #7  
Старый 29.06.2018, 15:03
Andrei Dzedolik
Guest
 
Сообщений: n/a
По умолчанию IPv6 & IPv4

Andrei Dzedolik написал(а) к Stas Mishchenkov в Jun 18 10:48:40 по местному времени:

Greetings, traveler ...

29 Jun 18 08:09, you wrote to Alexandr Kruglikov:


SM>>> Как тогда мне правильно сделать, что бы он делал исходящие
SM>>> сесси только с этого IPv6 адреса и с любого из двух IPv4?

AK>> А три раза bindaddr нельзя?
AK>> Мне просто попробовать не на чем, у меня один такой и один такой
AK>> =(

SM> Даже два раза нельзя. Вернее можно, но дамп конфига показывает, что
SM> работает только последнее вхождение bindaddr, а на первое начинает
SM> ругаться в лог теми же словами.

Посмотрел в код клиента (client.c), ты выпадаешь тут:

if (config->bindaddr[0])
{
struct addrinfo *srcai, srchints;

memset((void *)&srchints, 0, sizeof(srchints));
srchints.ai_socktype = SOCKSTREAM;
srchints.ai_family = ai->aifamily;
srchints.ai_protocol = IPPROTOTCP;
if ((aiErr = getaddrinfo(config->bindaddr, NULL, &srchints, &srcai)) == 0)
{
if (bind(sockfd, srcai->ai_addr, src_ai->aiaddrlen))
Log(4, "bind: %s", TCPERR());
freeaddrinfo(src_ai);
}
else
if (aiErr == EAI_FAMILY)
/ address family of target and bind address don't match /
continue;
else
/ otherwise just warn and don't bind() /
Log(2, "bind -- getaddrinfo: %s (%d)", gai_strerror(aiErr), aiErr);
}

config->bindaddr может быть один и только один. По идее при несовпадении AF нашего bindaddr и адреса ноды, ты должен попасть в 'continue;' и клеинт долен попроболвать другой адрес ноды, но ты попадаешь Log(...) и что происхожит дальшье из твоего лога не понятно :) Сессия-то проходит дальше или нет?

Я думаю, нкжно поменять readcfg и читать все указанные bindaddr из конфига + перебирать их в этом куске клента по очереди. Будет время - перепишу, предложу патч.

\aID


--- GoldED+/BSD 1.1.5-b20170303
Ответить с цитированием