【问题标题】:Send TCP packet in C#在 C# 中发送 TCP 数据包
【发布时间】:2010-12-09 14:48:35
【问题描述】:

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

【问题讨论】:

  • "SocketType.Raw: [...] 您的应用程序在发送时必须提供完整的 IP 标头。[...]" 您是否尝试在数据包中包含完整的 IP 标头?
  • 错过了。生病尝试完整的 ip 标头,thx
  • 试过..再次没有传出数据包:(
  • 抱歉格式混乱,我不确定what happened there
  • @Bobby:哦,不是你的错,np :)

标签: c# tcp


【解决方案1】:

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

看看TCP/IP Raw Sockets

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

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

TCP 数据不能通过原始套接字发送。

如果您改变主意。也许你可以在图书馆eExNetworkLibrary找到你需要的东西。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 那是我的问题。我想用我的自定义数据包自己打开连接=/
    • 您可以自己打开连接,只需在您的sock 对象上调用Connect 方法即可。在我看来,您在这里缺少 1 行代码,仅此而已。
    • 如果我将我的套接字连接到一个关闭的端口,我会得到一个异常,但我想读取 Ack-Rst-Packet
    【解决方案3】:

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

    【讨论】:

    • 我不希望系统单独创建连接:(
    【解决方案4】:

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

    如果您使用 TcpClient 类来创建您的套接字会更好,请参阅 TcpClient.Client Property

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

    【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 抱歉不想依赖pcap,希望有其他解决方案=/
    【解决方案6】:

    你应该使用SocketType.Stream:

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

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

    【讨论】:

    • 我可以完全控制 Steam 中的每个数据包吗?
    猜你喜欢
    • 2018-04-12
    • 1970-01-01
    • 2015-04-10
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 2012-10-30
    相关资源
    最近更新 更多