UDPポートスキャナを作成しました。私は同じネットワーク内の別のデバイスにパケットを送信しますが、ここでは少し問題があります.Wiresharkが異なるポート(それぞれのポートが閉じている)で10パケットを送信すると、wiresharkは1パケットしか受け取りません。私は10種類のICMPパッケージを受け取るべきです: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);
}
}
}
Wiresharkの結果:
new Sender().SendUDPandGetStatus(selectedDevice, (ushort)i);
私は唯一の私が行にブレークポイントを置く場合は追加します。
ICMPは、pingメッセージであり、あなたは、ルーティングループを持っている場合はブロックされます。 cmd.exe> PING 192.168.0.104を使用してみて、応答を見てください。 [存続可能時間]をチェックして、メッセージが通過したルータの数を示します。 – jdweng
あなたは正しいかもしれませんが、私の場合は同じルータに2台のコンピュータを接続しています。 tracertコマンドとTTLの値が高いことを確認しました。私は問題が "Linux 2.4.20カーネルは到達不能なメッセージを1秒に1つに制限する"と考えています。 「System.Threading.Thread.Sleep(1000);」を追加するとループ内で、問題が消えます。私はウィンドウ上の制限がLinux上と同じであることを推測することができます。 –
IPアドレスとマスクを取得し、ルートがあることを確認してください。サブネット内の各デバイスにpingを送信して、到達可能なデバイスを確認することができます。また、宛先デバイスとpingソースデバイスに移動します。私は、あなたが一方向へのルートを持っていないと思う。 – jdweng