Как отправить необработанные данные по сети? - PullRequest
4 голосов
/ 22 марта 2010

У меня есть некоторые данные, хранящиеся в байтовом массиве. Данные содержат пакет IPv4 (который содержит пакет UDP).

Я хочу отправить этот массив необработанным по сети, используя C # (предпочтительно) или C ++. Я не хочу использовать UDP-клиент C #, например.

Кто-нибудь знает, как это сделать?

Ответы [ 5 ]

4 голосов
/ 22 марта 2010

Попробуйте сырые сокеты (укажите SOCK_RAW для типа сокета).
Вы также будете нести ответственность за вычисление контрольных сумм IP. Это может быть немного раздражает.

1 голос
/ 22 марта 2010

Я нашел решение для майской проблемы: см. Ответ по адресу: Как подделать IP-адрес источника udp-пакета?

1 голос
/ 22 марта 2010
using System.Net;
using System.Net.Sockets;

public class Test
{
    public void Send(byte[] rawData, IPEndPoint target)
    {
        // change what you pass to this constructor to your needs
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IPv4);

        try
        {
            s.Connect(target);
            s.Send(rawData);
        }
        catch(Exception ex)
        {
            // handle this exception
        }
    }
}
0 голосов
/ 20 апреля 2010

Вот способ отправки необработанных данных через NIC http://www.codeproject.com/KB/IP/sendrawpacket.aspx Как уже упоминалось выше, Windows ограничивает операции с необработанными сокетами, необходимо изменить драйвер NDIS, чтобы иметь возможность отправлять все, что вы хотите. Конечно, тогда у вас будут проблемы с подписью цифрового драйвера на Vista / 7 (может быть временно обойдено в тестовом режиме).

0 голосов
/ 22 марта 2010

Если у вас есть необработанные данные (то есть байтовый массив), и вы хотите отправить их по сети, вам нужна какая-то кодировка:

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

Кодировка решает первую точку выше.
TCP является общепринятым решением для вторых двух пунктов.

Примеры кодирования:

  • HTTP кодирует длину в строках с разделителями cr, а затем - в виде двоичного двоичного объекта.
  • Текстовые файлы могут быть разделены ctrl-z.
  • XML может быть ограничен просто синтаксисом тегов.
...