2016-09-11 4 views
0

Запуск ядра Linux 3.9, а позже у меня есть приложение X, которое прослушивает конкретный сокет для соединений. Я хочу написать несвязанное приложение Y, которое отслеживает количество попыток подключения к этому сокету, исходный IP и т. Д.Разделите сокет (прослушивание) между несвязанными процессами

Возможно ли в C++ (в идеале через библиотеку Qt) совместно использовать/контролировать сокет в использовании несвязанного процесса? Я нашел несколько вопросов, связанных с StackOverflow, которые предлагают использовать forking для совместного использования сокета, но в этом случае это невозможно.

+1

вы можете использовать 'tcpdump': http://superuser.com/questions/604998/monitor-tcp-traffic-on-specific-port –

+0

Один из способов сделать это (что не будет полагаться на какие-либо специальные ОС- уровень) будет заключаться в том, чтобы Y принимал соединения от имени X и выступал в качестве прокси для X (путем подключения к порту X и пересылки трафика туда и обратно). Тем не менее, Y должен принимать соединения на другом порту. Это может быть проще просто прямо на инструменте X, если у вас есть возможность сделать это. –

ответ

1

Можно передать дескриптор файла в другой процесс, который ведет себя как кросс-процесс dup (2). См. Can I open a socket and pass it to another process in Linux. Но это должно быть явно сделано, т. Е. Один процесс отправляет дескриптор файла, а другой его получает. Таким образом, «не связанный» процесс должен сотрудничать.

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

Учитывая правильные разрешения и ОС, вы можете отслеживать поведение приложения на уровне системного вызова с помощью интерфейса ptrace (2) или аналогичного интерфейса. Там вы можете увидеть, использует ли приложение accept и что оно возвращает. Или, как указано в комментарии, вы можете использовать захват пакетов (tcpdump, raw сокеты), чтобы просто наблюдать за трафиком и вычитать из успешного рукопожатия TCP, что какой-то (неизвестный) процесс должен был принять соединение.

+0

Процесс X написан другой компанией - у меня нет доступа к ее внутренним элементам ... – TSG

+0

@Telium: что оставляет вас с ptrace и захватами пакетов. Или вы можете попробовать перехватить вызовы libc для принятия. –