Python 是否可以让一个套接字监听两个UDP IP,一个是127.0.0.1(同一台机器),另一台是不同的计算机?

Python 是否可以让一个套接字监听两个UDP IP,一个是127.0.0.1(同一台机器),另一台是不同的计算机?,python,sockets,tcp,udp,communication,Python,Sockets,Tcp,Udp,Communication,我使用的眼球跟踪应用程序利用UDP发送数据包。我在同一台计算机上制作了一个python套接字来监听数据并将其转储到一个.txt文件中。我已经有这么多工作了 另一个同样用python编写的应用程序(眼睛跟踪的对象所看到的)在另一台计算机上运行。因为眼球跟踪应用程序是连续的,并且发送不必要的数据,所以到目前为止,我不得不在受试者观看所需刺激时手动解析出实例。我这样做是基于手动同步启动刺激和眼球跟踪应用程序,然后通过日志文件进行挖掘 我想做的是让第二台计算机充当第二个UDP客户端,每次受试者看到刺激时

我使用的眼球跟踪应用程序利用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 I能够绑定到以太网接口上的主机地址,并从计算机B向计算机a发送消息,但计算机a不再能够从自身接收数据包。当我指定
UDP\u IP='0.0.0.0'
时,计算机B不再能够通过以太网发送数据。当我指定
UDP_IP=''
时,我收到了
`错误:[Errno 10048]通常只允许使用每个套接字地址(协议/网络地址/端口)

这与我在计算机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\U ANY,所以我没有。但是我确实试过一次,在那里导入socket.INADDR\u ANY但是得到了
ImportError:没有名为INADDR\u ANY的模块

根据你的回答,这似乎是一个简单的问题,所以我不确定我把事情搞砸了

EDIT2:我只是重新阅读了你的答案,明白了为什么socket.INADDR\u ANY不起作用。请忽略我之前编辑的那部分内容


EDIT3:好的,我在指定主机IP时没有拾取数据的原因是,我从计算机A上收集数据的应用程序仍然被指定发送到127.0.0.1。所以我想出来了。我仍然很好奇为什么0.0.0.0不起作用

否。套接字一次只能绑定到一个地址*

如果恰好有一个地址可以处理您想要的两件事情,那么您可以使用一个套接字来侦听它。在这种情况下,
INADDR\u ANY
主机(
0.0.0
)可能正是您要寻找的,它将处理所有接口上的任何(IPv4)连接,包括环回连接和其他连接。即使没有预先存在的地址可以满足您的需要,您也可以通过ipfilter类型的接口设置一个地址

但否则,您必须创建两个套接字。这意味着您需要使用类似于
选择的方法进行多路复用,或者创建两个线程


在本例中,您希望指定一台主机,该主机可以同时侦听本地计算机和同一以太网网络上的另一台计算机。您可以在以太网接口上获取主机地址并将其绑定。(您的计算机可以在其任何接口上与自己通信。)通常,在“无论什么接口是默认接口”上获取您的地址也适用于此,您会在某些地方看到绑定到
socket.gethostname()
的代码,例如。但是绑定到INADR\u ANY
要简单得多。除非您想确保某些接口上的计算机无法与您联系(这通常仅在您正在构建一个服务器以在防火墙的DMZ上运行时是一个问题),否则您通常需要使用
INADDR\u ANY


最后,如何绑定到INADR\u ANY?简单的回答是:如果您想更明确,只需使用
UDP_IP=''
,或
UDP_IP='0.0.0'
。任何理解套接字的人,即使他们不懂任何Python,也会理解服务器代码中的
'0.0.0'
含义。(你可能会想知道为什么Python在
socket
模块中没有一个常量,尤其是在像C这样的低级语言中。答案是它有,但它不是真正可用的。**)


*请注意,绑定到单个地址并不意味着您只能从单个地址接收数据包;这意味着您可以从可访问该地址的所有网络接收数据包。例如,如果您的计算机有一个LAN连接(地址为10.0.0.100)和一个WAN连接(地址为8.9.10.11),如果您绑定了10.0.0.100,您可以从其他LAN客户端(如10.0.0.201和10.0.0.202)接收数据包。但您无法从WAN客户端接收数据包,如9.10.11.12和10.0.0.100


**在低级套接字API中,点字符串地址(如
'0.0.0'
)被转换为32位整数(如
0
)。Python有时将这些整数表示为
int
s,有时表示为4字节缓冲区,如
b'\0\0\0'
。根据您的平台和版本,
socket.INADDR\u ANY
常量可以是
0
b'\0\0\0'
bind
方法不会采用
0
,也可能不会采用
b'\0\0\0'
。如果不先检查表单,然后调用正确的函数,就无法转换为
'0.0.0'
。这太难看了。这就是为什么只使用
'0.0.0.0'

更容易的原因。我相信您可以将原始套接字绑定到整个接口,但您似乎使用了两个不同的接口


最好在select()中使用两个套接字。

您可能会澄清,一个UDP套接字可以从任意数量的源接收UDP数据包。@JeremyFriesner:ID