Определить, подключается ли программа сокета к себе - PullRequest
1 голос
/ 06 апреля 2009

Как в C я могу определить, подключается ли программа к себе.

Например, я настроил прослушиватель на порт 1234, затем настроил другой сокет для подключения к произвольному адресу на порту 1234. Я хочу определить, подключаюсь ли я к своей программе. Есть ли способ?

Спасибо, Dave

Ответы [ 4 ]

1 голос
/ 06 апреля 2009

Одним из параметров функции accept() является указатель на struct sockaddr.

При вызове accept() на стороне сервера он заполнит адрес удаленного компьютера, подключенного к сокету вашего сервера.

Если этот адрес совпадает с адресом любого из интерфейсов на этом компьютере, это означает, что клиент находится на том же компьютере, что и сервер.

1 голос
/ 06 апреля 2009

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

fuser -n tcp <port-number>

и получите список процессов, прослушивающих этот порт. Затем вы можете заглянуть в /proc и выяснить, существует ли процесс с не вашим собственным pid, который выполняет тот же двоичный файл, что и вы. Немного жевательной резинки и пломбировочной проволоки помогут сохранить все приспособления вместе.

Не думаю, что вы можете легко задавать вопросы о процессе на другом компьютере.

0 голосов
/ 06 апреля 2009

Полагаю, вы имеете в виду не просто одну и ту же программу, а один и тот же экземпляр, работающий на той же машине.

Вас волнует случай, когда вы подключаетесь к себе через сеть (возможно, у вас есть две сетевые карты, или маршрутизатор с переадресацией портов, или какая-то необычная маршрутизация в Интернете где-то)?

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

Если вам небезразличен этот случай «непрямой обратной связи», сделайте некоторое рукопожатие, включая случайно сгенерированное число, которое две конечные точки разделяют через память. Я не знаю, есть ли проблемы с безопасностью в вашей ситуации: если это так, имейте в виду, что это почти наверняка подпадает под действие MITM, если только вы не защищаете соединение.

0 голосов
/ 06 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...