Как да изпращате необработени данни през мрежа?

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

Искам да изпратя този масив необработен по мрежата, използвайки C# (предпочитано) или C++. Не искам да използвам udp-клиента на C# например.

Някой знае ли как да изпълни това?


person raisyn    schedule 22.03.2010    source източник
comment
Ако не UdpClient, тогава какво? TcpClient?   -  person Matt Davis    schedule 22.03.2010
comment
не... вижте отговора на Матиас Вандел, върви по правилния път...   -  person raisyn    schedule 22.03.2010
comment
Каква очаквате да бъде разликата, когато използвате необработени сокети? Какво се надявате да постигнете?   -  person Jon Skeet    schedule 22.03.2010
comment
вижте: stackoverflow.com/questions/2493384/   -  person raisyn    schedule 22.03.2010


Отговори (4)


Опитайте необработени сокети (посочете SOCK_RAW за типа на гнездото).
Вие ще отговаряте и за изчисляването на IP контролните суми. Това може да е малко досадно.

person Matthias Wandel    schedule 22.03.2010
comment
благодаря... опитвам се! +1 за хубавия отговор!!! - person raisyn; 22.03.2010
comment
мислите ли, че може да работи с: Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Raw); - person raisyn; 22.03.2010
comment
Само да знаете, получаването чрез необработени сокети в Windows изисква администраторски привилегии. Предаването чрез необработени сокети е ограничено по няколко начина, започвайки с Windows XP SP2 (msdn.microsoft.com/en-us/library/ms740548(VS.85).aspx). - person Matt Davis; 22.03.2010

Ето начин за изпращане на необработени данни през NIC http://www.codeproject.com/KB/IP/sendrawpacket.aspx Както бе споменато по-горе, Windows ограничава операциите с необработени гнезда, трябва да промените NDIS драйвера, за да можете да изпращате каквото искате. Разбира се, тогава ще имате проблем с подписването на цифров драйвер на Vista/7 (може временно да бъде заобиколен с тестов режим).

person raf    schedule 20.04.2010

Когато имате необработени данни (т.е. байтов масив) и искате да ги изпратите по мрежа, тогава имате нужда от някакъв вид кодиране:

  1. Ако изпращате множество блокове (цели масиви), получателят трябва да може да прави разлика между края на един и началото на следващия.
  2. Ако данните са наистина големи, по-добре е да ги разделите на по-малки блокове (да, пакети), за да играете добре с други потребители на мрежата.
  3. Трябва да знаете, че данните са без грешки при клиента, тъй като мрежите имат тенденцията да бъдат ненадеждни точно в неподходящия за вас момент.

Кодирането решава първата точка по-горе.
TCP е конвенционалното решение за вторите две точки.

Примери за кодиране са:

  • HTTP кодира дължината в cr разделени линии, след което чист двоичен петно.
  • Текстовите файлове могат да бъдат разделени с ctrl-z.
  • XML може да бъде разграничен просто чрез неговия синтаксис на тагове.
person quamrana    schedule 22.03.2010
comment
байтът [] вече съдържа IPv4 пакет. Той не се нуждае от повече кодиране, той трябва да спре TCP/IP стека да го кодира допълнително (чрез добавяне на друг IP+UDP заглавен плик и т.н.). - person Ben Voigt; 22.03.2010
comment
масивът е много малък, лесно се побира в един пакет. Основният проблем е, че метаинформацията (източник-ip, местоназначение-ip...) трябва да бъде изпратена необработена (има съхранени в масива). - person raisyn; 22.03.2010

person    schedule
comment
Благодаря ти много!!! Мога ли да посоча и IP-адреса на източника? - person raisyn; 22.03.2010
comment
Това ще добави IP+TCP заглавки върху съществуващия ви байт[]. Вашият пакет не съдържа ли вече адреса на местоназначението в заглавката, защо тогава ще посочите target, когато го изпращате? - person Ben Voigt; 22.03.2010
comment
да, rawData-Array вече съдържа напълно форматиран ipv4 пакет!!! (така че източникът и дестинацията са посочени в масива). Просто искам да подреждам! s.Connect(target); ме обърка! - person raisyn; 22.03.2010
comment
Socket s = нов Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IPv4); хвърля SocketException, когато го изпълня - person raisyn; 22.03.2010
comment
за да се отървете от изключението, използвайте ProtocolType.Tcp вместо IPv4. Но съм съгласен с Бен Фойгт - освен ако не искате IP+TCP заглавки върху съществуващия ви байт [], не трябва да използвате кода, който ви дадох. Ако не ви пука, ще работи добре. - person John Ruiz; 22.03.2010
comment
@ben voigt: някакви предложения да се отърва от ip+tcp заглавките в горната част на моя съществуващ байт[]??? - person raisyn; 22.03.2010