C# 使用Pcap.Net创建我自己的TCP数据包-数据包已发送,但从未到达目的地

C# 使用Pcap.Net创建我自己的TCP数据包-数据包已发送,但从未到达目的地,c#,networking,tcp,pcap.net,C#,Networking,Tcp,Pcap.net,您好,我正在使用Pcap.Net库创建自己的TCP数据包,如Syn/Fin/Ack,无需其他信息,我需要在不建立TCP连接的情况下对该数据包进行沙化。我只需要用这个包到达我的服务器端口 但是这种TCP包的构造永远不会到达我的服务器。但我确信数据包已经发送(由wireshark测试)。因此,请帮助我构造这些数据包,我不确定所有参数都正确使用。请显示wireshark捕获,显示数据包已发送。这里是屏幕i,向3个不同的端口发送3个数据包。如果你愿意的话,我可以给你看所有的wireshark文件。所以请

您好,我正在使用Pcap.Net库创建自己的TCP数据包,如Syn/Fin/Ack,无需其他信息,我需要在不建立TCP连接的情况下对该数据包进行沙化。我只需要用这个包到达我的服务器端口


但是这种TCP包的构造永远不会到达我的服务器。但我确信数据包已经发送(由wireshark测试)。因此,请帮助我构造这些数据包,我不确定所有参数都正确使用。

请显示wireshark捕获,显示数据包已发送。这里是屏幕i,向3个不同的端口发送3个数据包。如果你愿意的话,我可以给你看所有的wireshark文件。所以请给我一些建议?在ethernetLayer中的参数目的地(MAC地址)是我的路由器MAC哪条路到internet对吗?你怎么知道数据包没有到达服务器?您是否尝试查看发送到服务器的常规数据包并模仿它们?在服务器端运行deamon,它响应TCP数据包。现在Syn,Ack对我来说很好,但其他的仍然不起作用。我在局域网上进行了测试,一切正常(我将数据包从PC发送到局域网中的wifi路由器)。我和一些网络专家谈过,他们很伤心,在通往服务器的路上,路由器可以阻止这个数据包,因为我没有建立连接。
 private Packet BuildTcpPacket(string SourceIP, string DestIP, int sourceport, int destport,
        string payload, bool syn, bool ack, bool fin, bool rst, bool urg, bool psh, bool cwr, bool enc, bool ns, bool none)
    {
        EthernetLayer ethernetLayer = new EthernetLayer
        {
            Source = new MacAddress(tbMacVs.Text),  //doublechecked its OK
            Destination = new MacAddress(tbMacVy.Text), //OK
            EtherType = EthernetType.None, // Will be filled automatically.
        };

        IpV4Layer ipV4Layer = new IpV4Layer
        {
            Source = new IpV4Address(SourceIP), //OK
            CurrentDestination = new IpV4Address(DestIP),  //OK
            Fragmentation = IpV4Fragmentation.None,
            HeaderChecksum = null, // Will be filled automatically.
            Identification = (ushort)Convert.ToInt16("1000"), //1000
            Options = IpV4Options.None,
            Protocol = null, // Will be filled automatically.
            Ttl = (byte)Convert.ToInt16("64"), //64
            TypeOfService = 0,
        };

        TcpLayer tcpLayer = new TcpLayer();
        tcpLayer.SourcePort = (ushort)sourceport; //OK
        tcpLayer.DestinationPort = (ushort)destport; //OK
        tcpLayer.Checksum = null;// Will be filled automatically.
        tcpLayer.SequenceNumber = Convert.ToUInt16("124");
        tcpLayer.AcknowledgmentNumber = (ushort)Convert.ToUInt16("0");
        if (syn)
            tcpLayer.ControlBits = TcpControlBits.Synchronize;
        if (ack)
            tcpLayer.ControlBits = TcpControlBits.Acknowledgment;
        //if (fin)
        //    tcpLayer.ControlBits = TcpControlBits.Fin;
        //if (rst)
        //    tcpLayer.ControlBits = TcpControlBits.Reset;
        //if (urg)
        //    tcpLayer.ControlBits = TcpControlBits.Urgent;
        //if (psh)
        //    tcpLayer.ControlBits = TcpControlBits.Push;
        //if (cwr)
        //    tcpLayer.ControlBits = TcpControlBits.CongestionWindowReduced;
        //if (enc)
        //    tcpLayer.ControlBits = TcpControlBits.ExplicitCongestionNotificationEcho;
        //if (ns)
        //    tcpLayer.ControlBits = TcpControlBits.NonceSum; // not a flag, rather a tcp header bit set
        //if (none)
        //    tcpLayer.ControlBits = TcpControlBits.None;


        tcpLayer.Window = (ushort)Convert.ToUInt16("0");
        tcpLayer.UrgentPointer = 0;
        tcpLayer.Options = TcpOptions.None;

        PayloadLayer payloadLayer = new PayloadLayer
        {
            Data = new Datagram(Encoding.ASCII.GetBytes(payload)),
        };

        PacketBuilder builder = new PacketBuilder(ethernetLayer, ipV4Layer, tcpLayer, payloadLayer);

        return builder.Build(DateTime.Now);
    }