在C#中发送TCP数据包

时间:2010-12-09 14:48:35

标签: c# tcp

我想在C#中发送一个TCP数据包(带有自定义标头)。这样的数据包的构建没有问题,我有一个字节数组的数据。但是如何通过套接字发送此数据包?

我试过这样的事情:

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 个答案:

答案 0 :(得分:3)

要在Windows 7上发送您自己制作的TCP数据包,您需要一个像WinPcap这样的驱动程序。如果您使用WinPcap,您可以使用众多.NET包装器之一或自己编写代码。仅使用Windows API提供的对象(如套接字)发送原始帧将不起作用。

只需查看 TCP/IP Raw Sockets

唯一的选择是创建自己的网络监控驱动程序,或者购买不需要安装但可以无缝集成到程序中的商业版WinPcap。

  

在Windows 7,Windows Vista,Windows XP Service Pack 2(SP2)和Windows XP Service Pack 3(SP3)上,通过原始套接字发送流量的功能受到多种限制:

     

无法通过原始套接字发送TCP数据。

对于你改变主意的情况。也许你可以在图书馆eExNetworkLibrary找到你需要的东西。

它包含一个WinPcap包装器以及许多用于制作和分析数据包的方法和对象。愿它有用。

答案 1 :(得分:1)

您是否尝试发送TCP数据包或UDP数据包?如果要发送TCP数据包,在尝试发送数据包之前,需要Connect()到远程端点。

答案 2 :(得分:1)

对于TCP,您需要连接到远程端点。

最好使用TcpClient类创建套接字,请参阅 TcpClient.Client Property

查看 Socket Send and Receive [C#] 中的示例。

答案 3 :(得分:1)

您正在绑定套接字,但您应该Connect()(到另一个端点)。

答案 4 :(得分:1)

要制作自定义数据包并在网络上发送,您应该查看 Pcap.Net 。查看 an answer to Stack Overflow question "IP address spoofing using SharpPcap on C#" 中提供的示例代码。

答案 5 :(得分:0)

您应该使用SocketType.Stream

  

SocketType.Raw:支持对底层传输协议的访问。使用SocketTypeRaw,您可以使用Internet控制消息协议(Icmp)和Internet组管理协议(Igmp)等协议进行通信。您的应用程序必须在发送时提供完整的IP标头。收到的数据报返回时,IP头和选项保持不变。

     

SocketType.Stream:支持可靠的,双向的,基于连接的字节流,不会重复数据,也不会保留边界。这种类型的套接字与单个对等体通信,并且在开始通信之前需要远程主机连接。 Stream使用传输控制协议(Tcp)ProtocolType和InterNetworkAddressFamily。