如何通过网络发送原始数据?

时间:2010-03-22 17:46:59

标签: c# networking network-programming network-protocols

我有一些数据存储在字节数组中。数据包含IPv4数据包(包含UDP数据包)。

我想使用C#(首选)或C ++通过网络原始发送此数组。我不想使用C#的udp-client作为例子。

有谁知道如何执行此操作?

5 个答案:

答案 0 :(得分:4)

尝试原始套接字(为套接字类型指定SOCK_RAW) 您还将负责计算IP校验和。这可能有点烦人。

答案 1 :(得分: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
        }
    }
}

答案 2 :(得分:1)

我找到了可能出现问题的解决方案:请参阅答案:How to fake source ip-address of a udp-packet?

答案 3 :(得分:0)

以下是通过NIC http://www.codeproject.com/KB/IP/sendrawpacket.aspx发送原始数据的方法如上所述,Windows限制原始套接字操作,您必须修改NDIS驱动程序才能发送您想要的任何内容。当然,您将遇到Vista / 7上的数字驱动程序签名问题(可以通过测试模式临时绕过)。

答案 4 :(得分:-1)

如果您有原始数据(即字节数组)并且想要通过网络发送它,那么您需要某种编码:

  1. 如果您发送多个块(整个阵列),则收件人需要能够区分一个块的结尾和下一个块的开头。
  2. 如果数据真的很大,最好将其拆分成较小的块(是的,数据包),以便与网络的其他用户很好地配合。
  3. 您需要知道客户端的数据没有错误,因为网络在您错误的时间可能会出现不可靠的情况。
  4. 编码解决了上面的第一点 TCP是后两点的传统解决方案。

    编码的例子是:

    • HTTP以cr分隔行编码长度,然后编码纯二进制blob。
    • 文本文件可以是ctrl-z分隔。
    • XML可以通过标签的语法简单地分隔。