LINUX.ORG.RU

Не работает сеть после переподключения сетевого кабеля.

 , , , ,


0

1

Всем привет.

Есть проблема с девайсом, который я собрал на основе Gumstix микрокомпьютера. Сделал борд с smc911x сетевым чипом и активным Ethernet портом, всё сразу завелось, Angstrom linux загрузился, сеть поднялась. Если ничего не делая отключать/подключать сетевой кабель к девайсу, то он подхватывается каждый раз отлично, но стОит заюзать его в моей программе (небольшой сервер на tcp соккетах) и переподключение кабеля уже не работает, т.е. линукс не видит сеть + собсно сами светодиоды на ethernet разъёме не загораются сразу, а лишь по прошествии длительного времени (несолько часов ожидания) или после ребута.

Алгоритм действий проявления бага: включаю девайс с сетью, включаю серверное приложение, отсоединяю кабель, отключаю/не отключаю серверное приложение, вставляю сетевой кабель обратно, сеть не заводится.

Сначала после завершения серверного приложения я наблюдал висящие соккеты на TIME_WAIT, после чего сконфигурил до старта сервера систему так:

echo 4 > /proc/sys/net/ipv4/tcp_fin_timeout

echo 1 > /proc/sys/net/ipv4/tcp_orphan_retries

echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle

echo 2 > /proc/sys/net/ipv4/tcp_keepalive_time

echo 1 > /proc/sys/net/ipv4/tcp_keepalive_intvl

echo 2 > /proc/sys/net/ipv4/tcp_keepalive_probes

соккеты стали почти сразу удаляться, но это никак не решило проблему - сеть заводится только после перезагрузки или очень долгого простоя. Не верится, что это хардварный баг ибо схемотехника - копия с рабочего борда для Gumstix-а, с тем же контроллером и т.п. + сеть же работает и переподключается, если не юзать TCP.

Есть какие-нибудь мысли по это теме?

Пробовал перезапускать сеть в системе - не помогло ( system(«/etc/init.d/networking restart»);

пробовал только eth0 перезапускаь - и это не помогло.

Ответ на: комментарий от Slackware_user

Детектю просто и это работает отлично.

struct ifreq ifr;
memset(&ifr, 0, sizeof(struct ifreq));
strcpy(ifr.ifr_name, "eth0");
int sockfd = socket(AF_INET, SOCK_STREAM, 0);

ioctl(sockfd, SIOCGIFFLAGS, &ifr);
close(sockfd);
return ifr.ifr_flags & IFF_RUNNING ? true : false;

l-proger ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.