问题描述
如题,效率要高,我先用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协议是无连接协议,传输速度快,但是没有确认机制,是不可靠的协议,需要自己定义返回信息的标志来判断对方是否收到信息而你说通过三次握手来判断开放端口,我不是说不可以,只是这效率。。。