Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 端口扫描程序-icmp数据包_C#_Networking_Udp_Pcap.net - Fatal编程技术网

C# 端口扫描程序-icmp数据包

C# 端口扫描程序-icmp数据包,c#,networking,udp,pcap.net,C#,Networking,Udp,Pcap.net,我写了一个UDP端口扫描器。我向同一网络中的另一个设备发送一个数据包,但这里有一个小问题,为什么wireshark只接收一个数据包,如果我在不同端口发送10个数据包(每个端口都关闭)。我应该收到10个类型为3的ICMP包。我应该在我的代码中更改什么来获得这些 using PcapDotNet.Core; using PcapDotNet.Packets; using PcapDotNet.Packets.Ethernet; using PcapDotNet.Packets.IpV4; using

我写了一个UDP端口扫描器。我向同一网络中的另一个设备发送一个数据包,但这里有一个小问题,为什么wireshark只接收一个数据包,如果我在不同端口发送10个数据包(每个端口都关闭)。我应该收到10个类型为3的ICMP包。我应该在我的代码中更改什么来获得这些

using PcapDotNet.Core;
using PcapDotNet.Packets;
using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.Transport;
using System;
using System.Collections.Generic;

namespace SendingASinglePacketWithSendPacket
{
class Program
{
    static void Main(string[] args)
    {
        IList<LivePacketDevice> allDevices = LivePacketDevice.AllLocalMachine;
        PacketDevice selectedDevice = allDevices[2];


        for (int i = 1; i < 10; i++)
        {
            new Sender().SendUDPandGetStatus(selectedDevice, (ushort)i);
        }


        System.Console.ReadKey();
    }
}

class Sender
{
    public void SendUDPandGetStatus(PacketDevice selectedDevice, ushort port)
    {
        using (PacketCommunicator communicator = selectedDevice.Open(100, PacketDeviceOpenAttributes.Promiscuous, -1))
        {           
            communicator.SendPacket(BuildUdpPacket(port));
        }
    }

    private static Packet BuildUdpPacket(ushort destinationPort)
    {
        EthernetLayer ethernetLayer = new EthernetLayer
        { 
            Destination = new MacAddress("14:cc:20:2c:7e:36"),
            Source = new MacAddress("9C:4E:36:17:86:48"),

            EtherType = EthernetType.None,
        };

        IpV4Layer ipV4Layer =new IpV4Layer
        {
            Source = new IpV4Address("192.168.0.104"),
            CurrentDestination = new IpV4Address("192.168.0.105"),
            Fragmentation = IpV4Fragmentation.None,
            HeaderChecksum = null, 
            Identification = 123,
            Options = IpV4Options.None,
            Ttl = 30,
            TypeOfService = 0,
        };

        UdpLayer udpLayer = new UdpLayer
        {
            SourcePort = 4050,
            DestinationPort = destinationPort,
            Checksum = null, 
            CalculateChecksumValue = true,
        };

        PacketBuilder builder = new PacketBuilder(ethernetLayer, ipV4Layer, udpLayer);
        return builder.Build(DateTime.Now);
    }
}
}

然后按F5按钮(间隔5秒),得到正确的结果。

这是我在Nmap文档中找到的:

Nmap检测到速率限制并相应减速以避免 目标计算机将使用无用的数据包淹没网络 滴不幸的是,Linux风格的每秒限制一个数据包 使65536端口扫描耗时超过18小时。超速驾驶的想法 UDP扫描包括并行扫描更多主机,执行 首先快速扫描常用端口,从端口后面扫描 防火墙,并使用--host timeout跳过慢速主机


ICMP是一条ping消息,如果您有路由循环,它将被阻止。尝试使用from cmd.exe>PING 192.168.0.104并查看响应。检查生存时间,以指示消息通过了多少路由器。你可能是对的,但在我的情况下,我有两台计算机连接到同一路由器。我检查了tracert命令和更高的TTL值-相同。我认为问题在于:“Linux2.4.20内核将无法到达目的地的消息限制在每秒一条”。若我在for循环中添加“System.Threading.Thread.Sleep(1000);”,问题就会消失。我可以推断windows上的限制与linux上的相同。获取ip地址和掩码,并确保您有路由。您可能希望ping子网中的每个设备,以查看可以访问哪些设备。同时转到目标设备和ping源设备。我怀疑你有一条单向的路线,而不是回程路线。变速器在两个方向工作。问题在于接收到的ICMP数据包。我不能每秒获取超过一个(当所有端口都关闭时)。Linux机器与windows不同,可以有多个IP地址。所以你可以使用多个IP来愚弄Nmap。我在一些windows机器上进行了测试——效果相同,但在linux上一切正常。我预期的是相反的行为..具有一个IP的窗口仍然限制每秒一个数据包。使用多个IP,每个IP地址将有一个数据包。所以,若你们有5个IP地址,你们每秒将有5个数据包。是的,但测试只使用了一个IP地址。
new Sender().SendUDPandGetStatus(selectedDevice, (ushort)i);