这就是我想要做的:
我有一台Windows计算机和一台连接到同一无线路由器的Linux计算机(ubuntu 16.10) . 路由器连接到Internet,因为这可能会引起一些安全问题(我们不希望Windows计算机与网络通信) .
Windows计算机正在运行一个程序,该程序应该将数据流传输到UPD端口(比如端口1234) . 使用Microsoft TCPView实用程序,我可以看到Windows机器打开端口 . 实际上,它应该允许来自任何IP地址和任何端口的连接(这就是*在TCPView中的意思) .
当我尝试使用nmap从Linux计算机上找到Windows机器上的开放端口时,会发生以下情况:
Starting Nmap 7.01 ( https://nmap.org ) at 2017-01-30 16:50 EST
Nmap scan report for 192.168.0.164
Host is up (0.051s latency).
PORT STATE SERVICE
1510/udp open|filtered mvx-lm
MAC Address: 74:DE:2B:D8:26:24 (Liteon Technology)
至少,这告诉我linux机器可以看到Windows机器(我也可以ping它) . 但是,我不确定端口的开放状态 . 根据Nmap手册:
当无法确定端口是打开还是已过滤时,Nmap将端口置于此状态 . 对于打开端口没有响应的扫描类型,会发生这种情况 . 缺乏响应也可能意味着数据包过滤器丢弃了探测器或它引发的任何响应 . 因此,Nmap不确定端口是打开还是被过滤 . UDP,IP协议,FIN,NULL和Xmas扫描以这种方式对端口进行分类 .
当我尝试使用Python连接到端口时,会发生错误 . 这段代码
import socket
UDP_IP = "192.168.0.164"
UDP_PORT = 1234
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
导致错误'连接被拒绝' . 应该读出流数据的小C客户端程序也无法连接到端口 . 我现在使用Python来更快地测试端口的可访问性 .
相反,连接到TCP端口8080工作正常 . 此外,我一直在TCP之间通过相同的路由器来回发送数据,并使用一系列端口 .
其他重要信息:
-
如果我关闭Windows机器上的防火墙和病毒扫描程序,会发生同样的错误
-
我在Windows的高级防火墙设置中添加了UDP端口1234作为允许的连接 .
所以,我的问题是:
-
有人对如何调试/解决这种情况有任何建议吗?
-
UDP和TCP之间有什么不同会导致TCP在没有打嗝的情况下工作(在我过去的项目中)并导致UDP给我做噩梦?
3 回答
您忘记了UDP不是基于连接的协议 . 它是一种数据报协议 .
没有办法区分正在接收UDP数据包但没有响应它们的服务器,来自防火墙后面的服务器丢弃这些数据包 . 这就是nmap将端口描述为
open|filtered
的原因 - 它没有办法区分它 .您对
sock.bind
的调用失败,因为您尝试绑定(即,开始侦听数据包!)到远程IP上的端口 . 一般来说这是不可能的 .事实证明,我的问题是双重的
1)我对UDP协议的理解不足 . 这已经被论坛中的答案纠正了 . 对于对如何使用UDP和Python在两台计算机之间进行通信感兴趣的人,请参阅此配方:http://code.activestate.com/recipes/578802-send-messages-between-computers/
2)我尝试与之通信的Windows程序不能用于通过UDP通过UDP发送数据 . 为什么?我不知道 . 我打电话给开发人员,这就是他告诉我的 .
当前状态:问题没有解决,但被诊断为我缺乏知识和意识异常的Windows程序的组合(参见我上面的原帖)
您正在尝试绑定到非本地IP地址 . 使用0.0.0.0而不是您正在使用的目标地址,使用
connect()
或sendto()
作为目标地址 .