C# 如何实现快速扫描局域网中开放特定端口的目标主机

问题描述

如题,效率要高,我先用UDp扫出存活主机,再用TCP去connect连接?这要效率会不会高一点

解决方案

解决方案二:
大概是类似于飞秋启动时那种获取好友列表的
解决方案三:
什么叫做“用UDP扫出存活主机”,请解释一下。
解决方案四:
利用UDP发包,查看能否回包,应该能看出主机存活吧
解决方案五:
引用3楼u014474572的回复:

利用UDP发包,查看能否回包,应该能看出主机存活吧

1.一般判断主机是否在线,一般是用ICMP协议(就是PING)2.UDP发包?发到哪个端口?你怎么知道这个端口就一定是开着的?3.即使这个端口是开着的也不一定会响应
解决方案六:
引用1楼u014474572的回复:

大概是类似于飞秋启动时那种获取好友列表的

飞秋是利用发送广播包获取用户列表的而不是扫描
解决方案七:
ICMP只能知道主机是开机的(网卡有响应),不代表服务程序启动了想知道都有哪些服务程序启动了,可以UDP发送广播,然后存活的服务就给发送广播的主机返回一个UDP数据包
解决方案八:
扫描永远是最慢的办法
解决方案九:
下一个asp.net大马里面有端口扫描功能
解决方案十:
丢个ARP包过去
解决方案十一:
有个比较简易的代码可以参考一下接收端textBox1.Text+="StartReceiveMessage"+Environment.NewLine;newThread(()=>{try{using(UdpClientudpClient=newUdpClient(11000)){IPEndPointRemoteIpEndPoint=newIPEndPoint(IPAddress.Any,0);while(true){Byte[]receiveBytes=udpClient.Receive(refRemoteIpEndPoint);stringreturnData=Encoding.UTF8.GetString(receiveBytes);Invoke((MethodInvoker)(()=>{textBox1.Text+="ReceiveMessage:"+returnData+Environment.NewLine;textBox1.Text+="ReceiveIP:"+RemoteIpEndPoint.Address+Environment.NewLine;textBox1.Text+="ReceivePort:"+RemoteIpEndPoint.Port+Environment.NewLine;}));}}}catch(Exceptionex){textBox1.Text+=ex.ToString();}}).Start();

发送端Socketsock=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);IPEndPointiep=newIPEndPoint(IPAddress.Broadcast,11000);sock.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);byte[]buffer=Encoding.UTF8.GetBytes("Hello");sock.SendTo(buffer,iep);sock.Close();

其中端口是11000
解决方案十二:
引用10楼lkhuge的回复:

有个比较简易的代码可以参考一下接收端textBox1.Text+="StartReceiveMessage"+Environment.NewLine;newThread(()=>{try{using(UdpClientudpClient=newUdpClient(11000)){IPEndPointRemoteIpEndPoint=newIPEndPoint(IPAddress.Any,0);while(true){Byte[]receiveBytes=udpClient.Receive(refRemoteIpEndPoint);stringreturnData=Encoding.UTF8.GetString(receiveBytes);Invoke((MethodInvoker)(()=>{textBox1.Text+="ReceiveMessage:"+returnData+Environment.NewLine;textBox1.Text+="ReceiveIP:"+RemoteIpEndPoint.Address+Environment.NewLine;textBox1.Text+="ReceivePort:"+RemoteIpEndPoint.Port+Environment.NewLine;}));}}}catch(Exceptionex){textBox1.Text+=ex.ToString();}}).Start();

发送端Socketsock=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);IPEndPointiep=newIPEndPoint(IPAddress.Broadcast,11000);sock.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);byte[]buffer=Encoding.UTF8.GetBytes("Hello");sock.SendTo(buffer,iep);sock.Close();

其中端口是11000

昨天考试去了.......感谢,先看下
解决方案十三:
引用10楼lkhuge的回复:

有个比较简易的代码可以参考一下接收端textBox1.Text+="StartReceiveMessage"+Environment.NewLine;newThread(()=>{try{using(UdpClientudpClient=newUdpClient(11000)){IPEndPointRemoteIpEndPoint=newIPEndPoint(IPAddress.Any,0);while(true){Byte[]receiveBytes=udpClient.Receive(refRemoteIpEndPoint);stringreturnData=Encoding.UTF8.GetString(receiveBytes);Invoke((MethodInvoker)(()=>{textBox1.Text+="ReceiveMessage:"+returnData+Environment.NewLine;textBox1.Text+="ReceiveIP:"+RemoteIpEndPoint.Address+Environment.NewLine;textBox1.Text+="ReceivePort:"+RemoteIpEndPoint.Port+Environment.NewLine;}));}}}catch(Exceptionex){textBox1.Text+=ex.ToString();}}).Start();

发送端Socketsock=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);IPEndPointiep=newIPEndPoint(IPAddress.Broadcast,11000);sock.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);byte[]buffer=Encoding.UTF8.GetBytes("Hello");sock.SendTo(buffer,iep);sock.Close();

其中端口是11000

昨天考试去了.......感谢,先看下
解决方案十四:
引用10楼lkhuge的回复:

有个比较简易的代码可以参考一下接收端textBox1.Text+="StartReceiveMessage"+Environment.NewLine;newThread(()=>{try{using(UdpClientudpClient=newUdpClient(11000)){IPEndPointRemoteIpEndPoint=newIPEndPoint(IPAddress.Any,0);while(true){Byte[]receiveBytes=udpClient.Receive(refRemoteIpEndPoint);stringreturnData=Encoding.UTF8.GetString(receiveBytes);Invoke((MethodInvoker)(()=>{textBox1.Text+="ReceiveMessage:"+returnData+Environment.NewLine;textBox1.Text+="ReceiveIP:"+RemoteIpEndPoint.Address+Environment.NewLine;textBox1.Text+="ReceivePort:"+RemoteIpEndPoint.Port+Environment.NewLine;}));}}}catch(Exceptionex){textBox1.Text+=ex.ToString();}}).Start();

发送端Socketsock=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);IPEndPointiep=newIPEndPoint(IPAddress.Broadcast,11000);sock.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast,1);byte[]buffer=Encoding.UTF8.GetBytes("Hello");sock.SendTo(buffer,iep);sock.Close();

其中端口是11000

昨天考试去了.......感谢,先看下
解决方案十五:
缺乏基础知识。看tcp教材中关于三次握手的部分。扫描只要发syn包就行了,收到ack就是开放了端口。用一般的编程方法,无法写出来,因为出于安全考虑,不允许单独发syn报文。只能用winpcap的c#封装版本去写。udp跟tcp无关,icmp更是扯淡。为啥不懂的人总爱回复。
其他方案:
引用14楼mooniscrazy的回复:

缺乏基础知识。看tcp教材中关于三次握手的部分。扫描只要发syn包就行了,收到ack就是开放了端口。用一般的编程方法,无法写出来,因为出于安全考虑,不允许单独发syn报文。只能用winpcap的c#封装版本去写。udp跟tcp无关,icmp更是扯淡。为啥不懂的人总爱回复。

这位仁兄淡定~~TCP和UDP属于传输层ICMP属于网络层这个大家都知道无需多言楼主的需求是要实现类似飞秋的功能,这个需求有两个关键点:1.找到局域网中开放指定端口的主机2.向这个主机发送消息飞秋的实现方式:1.当客户端启动时使用UDP协议向255.255.255.255这个广播地址发送广播包,广播包内容包含用户名、工作组、主机名、IP等信息,收到此广播包后,就会在自己的用户列表中添加这个用户的用户名、工作组等信息,同时向对方IP发送本机用户的个人信息;从而双方都能建立起用户列表2.传送聊天信息时同样使用UDP协议;由于UDP协议是无连接协议,传输速度快,但是没有确认机制,是不可靠的协议,需要自己定义返回信息的标志来判断对方是否收到信息而你说通过三次握手来判断开放端口,我不是说不可以,只是这效率。。。

时间: 2024-09-08 22:19:27

C# 如何实现快速扫描局域网中开放特定端口的目标主机的相关文章

c#-C# 如何实现快速扫描局域网中开放特定端口的目标主机

问题描述 C# 如何实现快速扫描局域网中开放特定端口的目标主机 如题,大概是类似于飞秋启动时那个获取好友列表那种的,首先要考虑效率 解决方案 可以考虑用p2p协议. 也就是说用暴力扫描全网的电脑来进行节点机器的发现过程. 如果发现一个节点,那么就可以从节点中得到目前的节点网络拓扑图状况,并提交加入网络的请求. 这样的速度是飞快的... 每个节点功能相同,兼作服务器和客户机. 节点的管理有些象路由的管理,信息在网络中象水的波纹一样传播,直到"能量"耗尽. 解决方案二: test 解决方案

如何快速获取局域网中电脑的IP地址

  局域网中有很多电脑,为了规范局域网中的所有电脑IP地址,需要查看各台电脑的IP地址.而在"网上邻居"中,只能查看到电脑的名称,如何快速获取局域网中电脑的IP地址呢? 获取局域网中很多电脑的IP地址,可以通过工具软件来获取.比如,可以使用NetSuper之类的软件.在使用软件时,首先要保证局域网中的所有电脑都处在开机状态,然后运行NetSuper软件,在主窗口中,单击"搜索计算机".这时就可以在主窗口左侧的计算机列表中看到计算的信息,包括计算机名.IP地址.计算机

如何快速访问局域网中的文件夹

  每次访问局域网中的文件夹时,都需要通过"网上邻居",或者输入IP地址.主机名,才能访问,很麻烦. 快速访问保存在局域网中的文件夹,先在"网上邻居"中,找到局域网中需要经常访问的共享文件夹,在地址栏中将地址复制.然后右击桌面空白处,选择"新建""快捷方式",然后在"请键入项目的位置"选项中,将复制的共享文件夹地址粘贴.单击"下一步",然后给快捷方式起一个命名,设置完毕后,在桌面双击快捷

快速访问局域网中的文件夹

  每次访问局域网中的共享文件夹时,都要通过"网上邻居",或者在地址栏中输入IP地址或主机名,效率太低. 可以先通过"网上邻居"找到局域网中需要经常访问的共享文件夹,在地址栏中将共享文件夹的地址复制下来.然后在桌面的空白处右击,选择"新建"→"快捷方式",在打开的"创建快捷方式"的"请键入项目的位置"中按[Ctrl+V]组合键.单击"下一步",再给快捷方式命名,下次就

在vmware中开放VNC端口的方法

  1.编辑/etc/vmware/firewall/service.xml 代码如下: vi /etc/vmware/firewall/service.xml 2.在该文件重中倒数第二行开始添加以下内容: 代码如下: VNC inbound tcp dst 40000 60000 true false 3.执行以下命令以使配置文件生效: 代码如下: esxcli network firewall refresh 4.查看是否已经生效: 代码如下: esxcli network firewall

如何快速在Word2013中输入特定短语

我们用Word写特定文章的时候,通常都会有需要重复输入的特定短语,例如"见下图"之类的,如果每次都要自己从头键入,虽然会习惯,但也很麻烦的好不好?有没有什么可以偷懒的法子呢? 偷懒方法如下: 1.用Word2013打开一篇文档,切换到"插入"选项卡,我们"符号"组中的"符号"命令,然后在弹出的菜单中选择"其他符号"选项. 2.此时会弹出一个"符号"对话框,我们单击左下角的"自动

如何在 vmware esxi 5.5 中开放 VNC 端口

1.编辑/etc/vmware/firewall/service.xml  vi /etc/vmware/firewall/service.xml 2.在该文件重中倒数第二行开始添加以下内容: <!-- Firewall configuration information for VNC --> <service id='0040'> <id>VNC</id> <rule id='0000'> <direction>inbound&l

如何用Java实现快速扫描当前局域网中的网络设备

问题描述 我用InetAddress的isReachable去试存在的主机,发现实在是太慢了,没做过这方面的,Java用什么方式实现快速扫描局域网内存在设备比较好呢?最好发现的是包括交换机.路由器等网络设备,而不是单一的主机.求大神指导 解决方案 解决方案二:多线程,使用如下函数,设置timeout时间.*@paramnetiftheNetworkInterfacethroughwhichthe*testwillbedone,ornullforanyinterface*@paramttlthem

局域网中如何快速查询有效IP地址?

局域网中如何快速查询有效IP地址?通常在日常使用电脑中为了让工作站顺利通过局域网上网,我们常常需要先为其配置一个有效的IP地址,不过局域网中究竟还有哪些IP地址没有被使用呢?本文现在为各位网友总结几则快速为工作站分配IP地址的绝招,希望这些技巧能帮助大家高效管理好局域网网络. 大家知道,局域网中的某台工作站如果在线,那么使用Ping命令测试该工作站的IP地址时,我们应该能够正常Ping通该工作站的IP地址;反过来,如果我们能够使用Ping命令正常Ping通某个IP地址,那就表明该IP地址已经被局