这就是我想要做的事情:
我有一台Windows计算机和一台连接到同一无线路由器的Linux计算机(ubuntu 16.10)。路由器不连接到Internet,因为这可能会引起一些安全问题(我们不希望Windows计算机与网络通信)。
Windows计算机正在运行一个程序,该程序应该将数据流式传输到UPD端口(比如端口1234)。使用Microsoft TCPView实用程序,我可以看到Windows机器打开端口。实际上,它应该允许来自任何IP地址和任何端口的连接(这就是TCP在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它)。但是,我不确定端口的 open | filtered 状态。根据Nmap手册:
当无法确定是否为时,Nmap将端口置于此状态 端口已打开或已过滤。对于打开的扫描类型会发生这种情况 端口没有响应。缺乏回应也可能意味着a 数据包过滤器丢弃了探测器或它引出的任何响应。所以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之间通过相同的路由器来回发送数据,并使用一系列端口。
其他重要信息:
所以,我的问题是:
答案 0 :(得分:1)
您忘记了UDP不是基于连接的协议。这是一个数据报协议。
没有办法区分正在接收UDP数据包但没有响应它们的服务器,而是从防火墙后面的服务器中删除这些数据包。这就是nmap将端口描述为open|filtered
的原因 - 它没有办法区分它。
您对sock.bind
的调用失败,因为您正尝试绑定(即,开始侦听数据包!)到远程IP上的端口。这一般是不可能的。
答案 1 :(得分:1)
事实证明我的问题是双重的
1)我对UDP协议的理解不足。这已经被论坛中的答案纠正了。对于对如何使用UDP和Python在两台计算机之间进行通信感兴趣的人,请参阅此配方:http://code.activestate.com/recipes/578802-send-messages-between-computers/
2)我尝试与之通信的Windows程序不能用于通过UDP通过UDP发送数据。为什么?我不知道。我打电话给开发人员,这是他告诉我的。
当前状态:问题没有解决,但被诊断为我缺乏知识和意识异常的Windows程序的组合(参见我上面的原帖)
答案 2 :(得分:0)
您正在尝试绑定到非本地IP地址。使用0.0.0.0代替您正在使用的目标地址,并使用connect()
或sendto()
目标地址。