Отправить TCP-пакет в C # - PullRequest
       4

Отправить TCP-пакет в C #

2 голосов
/ 09 декабря 2010

Я хочу отправить TCP-пакет (с настраиваемым заголовком) в C #.Построение таких пакетов не проблема, и у меня есть данные в байтовом массиве.Но как я могу отправить этот пакет через сокет?

Я пробовал что-то вроде этого:

using (Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP))
{
    TcpPacket tcpPacket = new TcpPacket();
    // fill tcpPacket with data
    sock.Bind(new IPEndPoint(MYADDRESS, MYPORT));
    byte[] data = tcpPacket.GetBytes();
    sock.SendTo(data, new IPEndPoint(DESTADDRESS, DESTPORT));
}

Это работает без каких-либо исключений, но анализ сети показывает, что ничего не отправляется.Какое решение?

Я использую Windows 7 Professional и не хочу, чтобы система создавала полное TCP-соединение в одиночку.

PS: я не хочу использовать некоторыедругая библиотека.

PS: Построение IP-пакетов также не является проблемой.

Ответы [ 6 ]

3 голосов
/ 19 декабря 2010

Для отправки собственного созданного TCP-пакета в Windows 7 вам потребуется драйвер, такой как WinPcap .Если вы используете WinPcap, вы можете использовать одну из множества оболочек .NET или написать свой собственный.Отправка необработанного фрейма только с объектами, предоставляемыми Windows API (например, сокетами), не будет работать.

Просто посмотрите Необработанные сокеты TCP / IP .

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

В Windows 7, Windows Vista, Windows XP с пакетом обновления 2 (SP2) и Windows XP с пакетом обновления 3 (SP3) возможность отправки трафика через необработанные сокеты была ограничена в несколькихспособы:

Данные TCP не могут быть отправлены через необработанные сокеты.

На случай, если вы передумаете.Может быть, вы найдете то, что вам нужно, в библиотеке eExNetworkLibrary .

Она включает в себя оболочку WinPcap и множество методов и объектов для создания и анализа пакетов.Пусть это будет полезно.

1 голос
/ 09 декабря 2010

Для создания пользовательских пакетов и отправки по сети вы должны взглянуть на Pcap.Net .Посмотрите пример кода, представленный в ответе на вопрос переполнения стека «Подмена IP-адреса с помощью SharpPcap на C #» .

1 голос
/ 09 декабря 2010

Вы связываете свой сокет, но вы должны Connect() (к другой конечной точке).

1 голос
/ 09 декабря 2010

Для TCP вам необходимо подключиться к удаленной конечной точке.

Лучше использовать класс TcpClient для создания сокета, см. Свойство TcpClient.Client .

Проверьте образец в Socket Send and Receive [C #] .

1 голос
/ 09 декабря 2010

Вы пытаетесь отправить пакет TCP или пакет UDP? Если вы хотите отправить TCP-пакет, вам нужно Connect() на удаленную конечную точку, прежде чем пытаться отправить пакет.

0 голосов
/ 09 декабря 2010

Вы должны использовать SocketType.Stream :

SocketType.Raw: Поддерживает доступ к базовому транспортному протоколу.Используя SocketTypeRaw, вы можете обмениваться данными, используя такие протоколы, как протокол управляющих сообщений Интернета (Icmp) и протокол управления группами Интернета (Igmp).Ваше приложение должно предоставить полный заголовок IP при отправке.Полученные дейтаграммы возвращаются с IP-заголовком и без изменений.

SocketType.Stream: поддерживает надежные двусторонние потоки байтов на основе соединений без дублирования данных и без сохранения границ.Сокет этого типа связывается с одним узлом и требует подключения к удаленному хосту, прежде чем связь может начаться.Поток использует ProtocolType протокола управления передачей (Tcp) и InterNetworkAddressFamily.

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