Программно включить / отключить сетевой интерфейс UNIX - PullRequest
4 голосов
/ 23 февраля 2011

Есть много очень похожих вопросов, но они все для окон - я хочу знать, как (если это возможно), я могу сделать так, чтобы моя программа на С (запускаемая как root, на linux) отключала сетевой интерфейс так,что он больше не получает пакетов.

Если кто-то может сказать мне, какие функции мне нужны для этого, это было бы здорово, но даже лучше, если бы вы могли связать меня с примером сценария или учебника где-нибудь, что (например, gratia) выключает и снова включает сетевой интерфейс.

Ответы [ 5 ]

4 голосов
/ 24 февраля 2011

Для Linux, все легко выполнимо с MNL и знанием протокола RTNL:

http://git.netfilter.org/cgi-bin/gitweb.cgi?p=libmnl.git;a=blob;f=examples/rtnl/rtnl-link-set.c;hb=HEAD

В Unix или других операционных системах доступен только вызов, специфичный для ОС, и / или архаичный вызов ioctl, последний из которых не может правильно выразить несколько адресов Linux на интерфейс, поэтому серьезные программы не используют его для этого. платформы.

2 голосов
/ 23 февраля 2011

У меня нет полного примера, но следующие ключевые слова помогут вам начать работу (по крайней мере, в Linux, если вы не уверены в других версиях Unix):

ioctl, SIOCSIFFLAGS, IFF_UP

Следующее может быть полезно для показа соответствующих API: http://www.google.com/codesearch/p?hl=en#2--Ws53NXRc/src/ifdown.c

1 голос
/ 23 февраля 2011

Как в Linux, так и в большинстве систем на основе Unix, которые я использовал, ifconfig <interface> up/down используется для включения или выключения интерфейса.Не уверен, что для этого есть подпрограмма C без исключения ifconfig.

1 голос
/ 23 февраля 2011

В Linux команда ip link set down dev ethX не делает больше или меньше того, что вы хотите. Я бы посоветовал вам вызвать эту программу, если вы работаете на этой платформе.

Если вы хотите сделать это самостоятельно, C api для этого не простая вещь. Вы можете погрузиться в источник iproute, чтобы узнать, что он делает.

Проверьте ответ @ user611775 за отличный пример того, как это сделать на C.

Если вы работаете в другом Unix, ответ, вероятно, будет отличаться для каждого конкретного варианта.

1 голос
/ 23 февраля 2011

В Linux вы можете использовать ifdown . Я не знаю, насколько это переносимо для других юниксов.

...