【发布时间】:2013-11-08 21:20:07
【问题描述】:
我使用的眼动追踪应用程序利用 UDP 发送数据包。我在同一台计算机上制作了一个 python 套接字来监听并将数据转储到 .txt 文件中。我已经有这么多工作了。
另外一个用 python 编写的应用程序(被眼球追踪的对象看到的东西)正在另一台计算机上运行。因为眼动追踪应用程序是连续的并且会发送不必要的数据,所以到目前为止,我不得不手动解析出受试者正在查看所需刺激时的实例。我这样做是基于刺激和眼动追踪应用程序的手动同步启动,然后挖掘日志文件。
我想要做的是让第二台计算机充当第二个 UDP 客户端,每次受试者注视刺激物(其中一个标记插入到 . txt 文件前面提到)。是否可以让一个套接字同时监听两个 IP 地址?
这是我的套接字脚本:
#GT Pocket client program
import datetime
import socket
now = datetime.datetime.now()
filename = 'C:\gazelog_' + now.strftime("%Y_%m_%d_%H_%M") + '.txt'
UDP_IP = '127.0.0.1' # The remote host (in this case our local computer)
UDP_PORT = 6666 # The same port as used by the GT server by default
sock = socket.socket(socket.AF_INET, #internet
socket.SOCK_DGRAM) #UDP
sock.bind( (UDP_IP, UDP_PORT) )
while True:
data, addr = sock.recvfrom( 1024) #I assume buffer size is 1024 bytes.
print "Received Message:", data
with open(filename, "a") as myfile:
myfile.write(str(data + "\n"))
sock.close()
myfile.close()
编辑:
@abarnert 我能够绑定到以太网接口上的主机地址,并从计算机 B 向计算机 A 发送消息,但计算机 A 不再能够接收来自自身的数据包。当我指定UDP_IP = '0.0.0.0' 时,计算机 B 不再能够通过以太网发送数据。当我指定UDP_IP = '' 时,我收到了`error: [Errno 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted
这与我在计算机 B 上用于发送数据的脚本有关:
import socket
UDP_IP = "169.254.35.231" # this was the host address I was able to send through.
UDP_PORT = 6666
MESSAGE = "Start"
print ("UDP target IP:"), UDP_IP
print ("UDP target port:"), UDP_PORT
print ("message:"), MESSAGE
sock = socket.socket(socket.AF_INET,
socket.SOCK_DGRAM)
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT) )
我不知道我需要在哪里(或根本不知道)我需要指定 INADDR_ANY,所以我没有。但我确实尝试过一次import socket.INADDR_ANY,但得到了ImportError: No module named INADDR_ANY
根据您的回复,这似乎是一个简单的问题,所以我不确定我在哪里搞砸了。
EDIT2:我只是再次重读您的答案并理解为什么 socket.INADDR_ANY 不起作用。请忽略我之前编辑的那部分
EDIT3:好的,我在指定主机 IP 时没有获取数据的原因是我在计算机 A 上收集数据的应用程序仍被指定为发送到 127.0.0.1。所以我想通了。我仍然很好奇为什么 0.0.0.0 不起作用!
【问题讨论】:
-
你当然可以使用两个socket绑定到你想监听的不同端点
-
从您的编辑和代码中的 cmets 来看,我认为您仍在混淆远程地址和本地地址的概念。远程地址是您要与之交谈的机器的地址。这是您在客户端中传递给
sendto(或connect)的地址。这不能是0.0.0.0。本地地址是您机器的地址。由于您的机器可以有多个地址,因此您必须bind其中一个地址才能监听该地址。这是您要使用0.0.0.0的地方,表示“监听我所有的地址”。
标签: python sockets tcp udp communication