在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数据包也不是问题。

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

只需查看TCP / IP Raw套接字即可

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

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

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

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

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

您是否尝试发送TCP数据包或UDP数据包? 如果要发送TCP数据包,则需要先将Connect()到远程端点,然后再尝试发送数据包。

你绑定你的套接字但你应该Connect() (到另一个端点)。

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

如果使用TcpClient类创建套接字更好,请参阅TcpClient.Client属性

查看套接字发送和接收[C#]中的示例。

要制作自定义数据包并在网络上发送,您应该查看Pcap.Net 。 查看Stack Overflow问题“在C#上使用SharpPcap进行IP地址欺骗”的答案中提供的示例代码。

你应该使用SocketType.Stream :

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

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