2010-03-22 12 views
4

J'ai des données stockées dans un tableau d'octets. Les données contiennent un paquet IPv4 (qui contient un paquet UDP).Comment envoyer des données brutes sur un réseau?

Je veux envoyer ce tableau brut sur le réseau en utilisant C# (préféré) ou C++. Je ne veux pas utiliser le client udp de C# par exemple.

Est-ce que quelqu'un sait comment effectuer cela?

+0

Si ce n'est pas UdpClient, alors quoi? TcpClient? –

+0

non ... voir Matthias Wandel réponse, ça va dans le bon sens ... – raisyn

+0

Qu'attendez-vous de la différence quand vous utilisez des douilles crues? Qu'espérez-vous réaliser? –

Répondre

4

Essayez les sockets raw (spécifiez SOCK_RAW pour le type de socket).
Vous serez également responsable du calcul des sommes de contrôle IP. Cela peut être un peu ennuyeux.

+0

merci ... J'essaie! +1 pour votre belle réponse !!! – raisyn

+0

pensez-vous qu'il pourrait fonctionner avec: Socket socket = new Socket (AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Raw); – raisyn

+0

Juste pour que vous sachiez, la réception via des sockets raw sur Windows nécessite des privilèges d'administrateur. La transmission via des sockets raw est limitée de plusieurs manières à partir de Windows XP SP2 (http://msdn.microsoft.com/en-us/library/ms740548(VS.85).aspx). –

1
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

Merci beaucoup !!! Puis-je également spécifier l'adresse IP source? – raisyn

+1

Cela va ajouter des en-têtes IP + TCP au-dessus de votre octet existant [].Votre paquet ne contient-il pas déjà l'adresse de destination dans l'en-tête, pourquoi alors spécifier _target_ en l'envoyant? –

+0

oui le rawData-Array contient déjà un paquet ipv4 entièrement formaté !!! (donc la source et la destination sont spécifiées dans le tableau). Je veux juste faire un tableau! 's.Connect (cible);' confus moi! – raisyn

-1

Lorsque vous avez des données brutes (c.-à-un-tableau d'octets) et que vous souhaitez l'envoyer sur un réseau, alors vous besoin d'une sorte d'encodage:

  1. Si vous envoyez plusieurs blocs (entier tableaux), le destinataire doit être capable de différencier entre la fin de l'un et le début de la suivante.
  2. Si les données sont vraiment grandes, il est préférable de les diviser en blocs plus petits (oui, paquets) pour bien jouer avec les autres utilisateurs du réseau.
  3. Vous devez savoir que les données sont exemptes d'erreurs chez le client car les réseaux ont tendance à ne pas être fiables au bon moment pour vous. Codage résout le premier point ci-dessus.


TCP est la solution conventionnelle aux deux deuxièmes points.

Des exemples de codage sont les suivants:

  • HTTP code pour la longueur des lignes délimitées cr, puis un objet binaire pur.
  • Les fichiers texte peuvent être délimités par ctrl-z.
  • XML peut être délimité simplement par sa syntaxe de tags.
+0

l'octet [] contient déjà un paquet IPv4. Il n'a pas besoin de plus d'encodage, il doit empêcher la pile TCP/IP de l'encoder davantage (en ajoutant une autre enveloppe d'en-tête IP + UDP, etc.). –

+0

le tableau est très petit, il s'intègre facilement dans un paquet. Le problème principal est que la métainformation (source-ip, destination-ip ...) doit être envoyée brute (elle est stockée dans le tableau). – raisyn

0

est ici un moyen d'envoyer des données brutes sur la carte réseau http://www.codeproject.com/KB/IP/sendrawpacket.aspx Comme mentionné ci-dessus Windows est limitant les opérations de sockets raw, vous devez modifier NDIS être capable d'envoyer ce que tu veux. Bien sûr, vous aurez alors un problème avec la signature numérique du pilote sur Vista/7 (peut être temporairement ignoré avec le mode test).