在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。
- 我可以使用System.Net.Mail将电子邮件标记为Outlook的“高重要性”吗?
- 将asp.net会员特定设置移动到单独的配置文件
- MVC2 ASP.Net URL会自动解码吗?
- 如何使用SQL参数从SQL Server获取数据集
- 以编程方式在asp.net应用程序上的microsoft.identityModel中配置federatedAuthentication元素
- 默认MVC 5应用程序的安全例外
- 如何使用method =“post”从表单中获取数据? 如何在我的控制器中请求数据?
- 将sqldatareader绑定到gridview c#
- 将GridViewComboBoxColumn绑定到数据源