Есть некое ПО, использующее SCTP и работающее на одной машине, но не работающее на другой. Все ПО и сетевые настройки на машинах абсолютно идентичны — для исключения эффекта разной кривизны рук/глаз обе машины загружались с linux liveusb и далее запускался скрипт в духе:
rpm -Uvh software.rpm
echo ... > /etc/software.conf
ip a add ...
ip r add ...
service software start
В поисках источника проблемы докатились до того, что написали маленький SCTP-сервер, который точно так же работает только на одной из машин:
#!/usr/bin/perluse strict;
use Socket;
my $proto = getprotobyname('sctp');
socket(server, PF_INET, SOCK_RAW, $proto) || die"socket error: $!";
bind(server, sockaddr_in(0, INADDR_ANY)) || die"bind error: $!";
my $buffer;
while (1) {
print"recv wait ...\n";
my $paddr = recv(server, $buffer, 65535, 0);
my ($port, $iaddr) = sockaddr_in($paddr);
print"recv from [".inet_ntoa($iaddr)."]\n";
}
На одной машине поведение такое:
# ./sctp.pl
recv wait ...
recv from [10.10.10.1]
recv wait ...
recv from [10.10.10.1]
Здравствуйте, ENP, Вы писали:
ENP>Здравствуйте!
ENP>Есть некое ПО, использующее SCTP и работающее на одной машине, но не работающее на другой. Все ПО и сетевые настройки на машинах абсолютно идентичны — для исключения эффекта разной кривизны рук/глаз обе машины загружались с linux liveusb и далее запускался скрипт в духе:
Ваершарковский дамп сними и посмотри что с пакетами и куда они ходят.
Здравствуйте, ENP, Вы писали:
ENP>socket(server, PF_INET, SOCK_RAW, $proto) || die "socket error: $!";
Не понятно почему здесь SOCK_RAW вместо SOCK_STREAM, в этом случае
все заголовки sctp должны формироваться в программе, чего
в этом perl скрипте нет, может в исходной проге то же самое?
Здравствуйте, ENP, Вы писали:
ENP>Здравствуйте, Kernan, Вы писали:
K>>Ваершарковский дамп сними и посмотри что с пакетами и куда они ходят.
ENP>Я показал дампы, не заметно?
Пакеты посмотреть нельзя. Что там в пакетах-то?
Здравствуйте, smeeld, Вы писали:
ENP>>socket(server, PF_INET, SOCK_RAW, $proto) || die "socket error: $!";
S>Не понятно почему здесь SOCK_RAW вместо SOCK_STREAM, в этом случае S>все заголовки sctp должны формироваться в программе, чего S>в этом perl скрипте нет, может в исходной проге то же самое?
Ну да, ПО само разбирает и собирает пакеты. В тестовом скрипте сборки/разборки не предполагается, тут хотя бы просто сам пакет получить
ENP>Ну да, ПО само разбирает и собирает пакеты. В тестовом скрипте сборки/разборки не предполагается, тут хотя бы просто сам пакет получить
В strace было видно, как ПО, которое требуется запустить, тоже зависает на recv — поэтому и написали на perl нечто максимально приближенное к оригиналу.
Здравствуйте, ENP, Вы писали:
ENP>Здравствуйте, smeeld, Вы писали:
ENP>>>socket(server, PF_INET, SOCK_RAW, $proto) || die "socket error: $!";
S>>Не понятно почему здесь SOCK_RAW вместо SOCK_STREAM, в этом случае S>>все заголовки sctp должны формироваться в программе, чего S>>в этом perl скрипте нет, может в исходной проге то же самое?
ENP>Ну да, ПО само разбирает и собирает пакеты. В тестовом скрипте сборки/разборки не предполагается, тут хотя бы просто сам пакет получить
Он тебе дело сказал. Кусок кода нс С. Если ты сам собираешь SCTP пакеты, то видимо неправильно это делаешь. Надеюсь ты понимаешь что такое SOCK_RAW.