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