Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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# 从ping主机c捕获IP地址#_C#_Networking_Ping - Fatal编程技术网

C# 从ping主机c捕获IP地址#

C# 从ping主机c捕获IP地址#,c#,networking,ping,C#,Networking,Ping,我想询问是否可以从ping主机获取IpAddress。所以如果有人ping我的电脑,我知道他的IP地址。我的代码如下所示: while (true) { Socket icmpListener = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); icmpListener.Bind(new IPEndPoint(IPA

我想询问是否可以从ping主机获取IpAddress。所以如果有人ping我的电脑,我知道他的IP地址。我的代码如下所示:

        while (true)
        {
            Socket icmpListener = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
            icmpListener.Bind(new IPEndPoint(IPAddress.Parse("564.89.556.5"), 0));
            icmpListener.IOControl(IOControlCode.ReceiveAll, new byte[] { 1, 0, 0, 0 }, new byte[] { 1, 0, 0, 0 });
            byte[] buffer = new byte[4096];
            EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
            int bytesRead = icmpListener.ReceiveFrom(buffer, ref remoteEndPoint);
            string text = "ICMPListener received " + bytesRead + " from " + remoteEndPoint;
            Console.WriteLine(text);                
        }
在代码运行并有人ping我之后,我知道哪个ip被ping了,而不是来自ping主机的ip。感谢您的支持。

试试:

var ip = icmpListener.RemoteEndPoint;
如果您使用的是面向连接的协议,RemoteEndPoint属性将获取包含套接字连接到的远程IP地址和端口号的端点。如果您使用的是无连接协议,RemoteEndPoint包含套接字将与之通信的默认远程IP地址和端口号。在检索任何信息之前,必须将此端点强制转换为IPEndPoint。然后可以调用IPEndPoint.Address方法来检索远程IPAddress,调用IPEndPoint.Port方法来检索远程端口号


使用cmd ping机器(
ping127.0.0.1
)时,您正在使用默认端口80 ping该机器

Socket icmpListener = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
        icmpListener.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80));
        icmpListener.IOControl(IOControlCode.ReceiveAll, new byte[] { 1, 0, 0, 0 }, new byte[] { 1, 0, 0, 0 });
        while (true)
        {
            byte[] buffer = new byte[4096];
            EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
            int bytesRead = icmpListener.ReceiveFrom(buffer, ref remoteEndPoint);
            Console.WriteLine("ICMPListener received " + bytesRead + " from " + remoteEndPoint);
        }
在执行任何操作之前,以管理员身份打开
CMD
,然后键入以下命令:
netsh advfirewall firewall add rule name=“All ICMP v4”dir=in action=allow protocol=icmpv4:any,any
这将允许防火墙规则允许接收ICMP端口无法访问的数据包。


别忘了以管理员的身份运行C#程序。在收到数据后,remoteEndPoint没有用远程地址更新吗?你能给我发一些源代码吗?我不知道如何以及在哪里更改代码。谢谢@adola。但有一个问题。它表示“阻止了发送或接收数据的请求,因为套接字未连接,并且(使用sendto调用在数据报套接字上发送时)未指定地址”。嗯,我认为有一个问题,因为ping太短了,所以如果我想得到RemoteEndPoit,主机已经关闭了连接。你知道怎么解决这个问题吗?顺便问一句@adola你已经问了我多少问题了?非常感谢@谢谢你!无论如何,我有一些问题要问:1)哪一行导致了错误2)您是否想过使用tcp而不是icmp。TCP更好,可以用于ping、发出HTTP请求等等!(如果需要,我可以提供一些ping代码)3)您使用什么代码连接(我使用cmd和ping命令)。4.)你在构造什么(这将帮助我理解你的代码)抱歉,如果问的太多了。C#中有一个类是为ping而构建的。看看这个