C # Нахождение идентификатора сокета? - PullRequest
2 голосов
/ 06 января 2011

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

(я использовал WPE Pro для фильтрации пакетов на тот случай, если вам интересно, WireShark слишком много хлопот для такогопростая задача.) Но меня беспокоит одна вещь: идентификатор сокета.

Я знаю, что это такое, и я уже задавал вопрос об этом раньше, но я не могу понять, как его использовать / назначить один/ перехватить один.

Без правильного идентификатора сокета моя программа не сможет ничего сделать, поэтому мой вопрос, возможно ли выяснить, какой идентификатор сокета использует сокет, как только вы захватите пакет?

Если нет, есть ли другие способы сделать это?- или, возможно, другие языки, такие как Visual Basic?

Спасибо за ваше время.

Ответы [ 3 ]

4 голосов
/ 10 января 2011

Если под идентификатором сокета вы подразумеваете возвращаемое значение успешного вызова функции socket(), я не думаю, что есть выход.

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

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

1 голос
/ 17 января 2011

Эта библиотека: SharpPcap обещает выполнять захват, внедрение, анализ и построение пакетов с использованием любого языка .NET, например C # и VB.NET ( больше информации ).

Это библиотека, используемая Wireshark , и она точно может захватывать и анализировать.

0 голосов
/ 13 января 2011

socket() возвращает дескриптор файла, если это то, что вы называете идентификатором сокета, то способы получить это без взаимодействия процесса с окнами ограничены.FWIW в linux open FD перечисляются в файловой системе proc.

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

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

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

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

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

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

Это должно работать практически во всем.Единственное предостережение: если трафик зашифрован, вы (очевидно) не сможете его проверить / изменить.Это практически то же самое, что и размещение вашего приложения за NAT.

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