Как я могу проверить, что пакет TCP получил ACK в C#?

Также см. Да, даже можно использовать CPAN. Это показывает, как можно использовать CPAN, не имея корня или sudo доступа.

5
задан Justin Tanner 8 December 2009 в 02:44
поделиться

7 ответов

Единственный способ узнать наверняка - реализовать какое-то подтверждение на уровне приложения. Пакет «ACK» уровня TCP вообще не отображается на уровне приложения, поэтому вам придется использовать что-то большее.

13
ответ дан 18 December 2019 в 06:50
поделиться

Я рекомендую использовать Pcap.Net .

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

Вы также можете легко создавать и отправлять пакеты.

1
ответ дан 18 December 2019 в 06:50
поделиться

Вы заставляете другой конец реагировать на это.

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

5
ответ дан 18 December 2019 в 06:50
поделиться

Эта информация недоступна в библиотеках классов .net. У меня были те же соображения, когда я начал работать над этим сканером портов на C #. Я использовал .NET-оболочку для libpcap (после установки соответствующего драйвера), SharpPcap ( http://sourceforge.net/projects/sharppcap/ ), чтобы получить такую ​​информацию. . Пакеты ACK получаются через интерфейс SharpPcap (прозрачно вызывая собственный интерфейс libpcap).

Мое приложение - NScanner Port Scanner / Sweeper, и вы можете найти код в codeplex, ссылаясь на мое простое использование вышеупомянутой библиотеки ( http://nscanner.codeplex.com/ ). 1237] Надеюсь, я помог.

3
ответ дан 18 December 2019 в 06:50
поделиться

Если вы действительно уверены, что вам нужно знать детали уровня пакетов вашего TCP-соединения, тогда в Помимо создания TCP-сокета для отправки, вам нужно, чтобы ваше приложение использовало API winpcap для просмотра необработанного трафика. Вы можете установить фильтр только для приема пакетов, относящихся к конкретному IP-адресу и комбинации портов, которая определяет вашу удаленную сторону.

Есть несколько проектов, создающих .NET-оболочки для libpcap, например здесь

0
ответ дан 18 December 2019 в 06:50
поделиться

Уровень TCP будет продолжайте повторно отправлять пакет до тех пор, пока он не получит успешный ACK.

Send будет блокироваться, пока это не произойдет - SendAsync не будет блокировать, и вы можете продолжить обработку других данных, пока уровень TCP обрабатывает отправку пакета.

-1
ответ дан 18 December 2019 в 06:50
поделиться

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

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

Возьмем HTTP в качестве примера протокола «Streaming like». Сервер отправляет поток данных клиенту. Больше нет дополнительных «ACK» прикладного уровня, и серверу на самом деле все равно, когда и как именно поступит его поток данных. Это очень эффективно для каналов с высокой задержкой.

Теперь сравните это с SMB! Вместо потоковой передачи файла данные разбиты на блоки. Каждый успешно переданный блок данных проверяется на уровне приложения. Это дает вам больше контроля, однако эффективно уничтожает протокол в сетях WAN (см. «Продукт задержки полосы пропускания»).

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

2
ответ дан 18 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: