2013-07-16 5 views
2

Я выполняю долговременное соединение сокетов, локально. Когда я убиваю серверное приложение, оно закрывается чисто. Теперь я хочу посмотреть, как ведет себя клиент, когда он не закрывается чисто. Если бы они были на разных серверах, я мог бы вытащить сетевой кабель. Когда соединение локально, мне нечего тянуть. [Вставить неприличный анекдот здесь.]Могу ли я имитировать вытягивание сетевого кабеля?

я могу сделать netstat -an |grep tcp | grep :80 и увидеть связь, которая выглядит примерно так:

tcp  0  0 10.1.2.3:80   10.1.2.3:40494  ESTABLISHED 

Могу ли я использовать этот номер 40494 порт, чтобы убить или повесить гнездо, точно так же, Я могу использовать PID программы, чтобы убить его?

Очень похожий вопрос: How can I simulate a 'plugged network cable' (TCP/IP)? (Этот вопрос спрашивает о Windows, я на Linux)

+3

Возможно, вы могли бы выполнить 'ifdown eth0' или независимо от своего сетевого интерфейса. Вы будете использовать sudo для него, и вам может понадобиться найти его в '/ sbin/ifdown', если он вернет его обратно – KeepCalmAndCarryOn

ответ

0

Похоже, что ответ «нет», нет способа убить конкретное соединение.

То, что я закончил, было sudo ifdown eth0 (потом sudo ifup eth0 для восстановления сети). Очевидно, что это метод кувалды, поскольку он снимает все соединения.

Для полноты другого подхода был угадать, какой процесс Apache выполнял соединение сокета, и убить только этот процесс. Но помимо привлечения догадок, это также более специфично для приложения, чем вопрос, который я задавал.

0

выгрузить модуль ядра для сетевого драйвера может убить его так, как вы хотите.

Выберите сетевой интерфейс из списка активных (eth0, eth1, и т.д ...)

ifconfig -a 
eth0  Link encap:Ethernet HWaddr 18:A9:05:68:6F:B0 
      inet6 addr: fe80::1aa9:5ff:fe68:6fb0/64 Scope:Link 
      UP BROADCAST RUNNING MULTICAST MTU:9000 Metric:1 

Чтобы найти модуль драйвера для интерфейса eth0

ls -l /sys/class/net/eth0/device/driver/module 
lrwxrwxrwx 1 root root 0 Aug 15 18:39 module -> ../../../../module/bnx2 

Для отображения списка модулей ядра для вашей системы

lsmod | grep bnx 
bnx2i     48158 0 
cnic     55511 1 bnx2i 
bnx2     81890 0 

Для извлечения модуля из памяти потребуется root или sudo access

rmmod -f -w bnx2 

Это не безопасная операция, и вы беспорядочно возитесь с операционной системой. Ожидайте, что плохие вещи (tm) произойдут, когда вы это сделаете. Не делайте этого в производственной среде. Также это может не работать в зависимости от поведения драйвера.

Тем не менее, это интересная проблема, и мне интересно узнать, как это получается.

Смежные вопросы