python - 如何在不使用多线程的情况下绑定(bind)多个IP?

标签 python multithreading sockets ip

我想知道是否可以在不使用多线程(创建几个套接字)的情况下绑定(bind)多个多播地址,只需创建一个可以从两个地址获取数据的套接字(这是我当前的做法)。

我的代码如下:

import socket
import struct
import time


MCAST_GRP2 = '239.0.1.105'
MCAST_GRP = '239.0.1.104'

MCAST_PORT = 12345


IS_ALL_GROUPS = True
#scan time in seconds
SCAN_TIME = 10
#sampling time in seconds
SAMPLING_TIME = 1
bufferUDP = 2048
totalSize = 0
bitrateList = []


sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

if IS_ALL_GROUPS:
    # on this port, receives ALL multicast groups
    sock.bind(("", MCAST_PORT))
    sock2.bind(("", MCAST_PORT))
else:
    # on this port, listen ONLY to MCAST_GRP
    sock.bind((MCAST_GRP, MCAST_PORT))
    sock2.bind((MCAST_GRP2, MCAST_PORT))

mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
mreq2 = struct.pack("4sl", socket.inet_aton(MCAST_GRP2), socket.INADDR_ANY)

sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
sock2.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq2)

print("_____.:|   Starting analysis of multicasts!   |:._____\n")


for x in range(SCAN_TIME):
    stop = time.time() + SAMPLING_TIME
    while (time.time()<stop):
        totalSize += len(sock.recv(bufferUDP)) + len(sock2.recv(bufferUDP))

    bitrateList.append(totalSize)
    print(bitrateList[x]*8/(1000000))
    totalSize = 0



bitrateList.pop(0)
txtfile = open("Bitrate_history_ip_{}.txt".format("TESTTT"),"w+")
for x in range(SCAN_TIME-1):
    bitrateList[x] = bitrateList[x]*8/(1000000)
    txtfile.write("{}.Bitrate was equal to: {} Mbps\n".format(x+1,bitrateList[x]))

txtfile.write("Maximum bitrate value was: {} Mbps\n".format(max(bitrateList)))
txtfile.write("Minimum bitrate value was: {} Mbps\n".format(min(bitrateList)))


print('End of test')
time.sleep(5)

并且基于:

How do you UDP multicast in Python?

最佳答案

.. just by creating one socket that can obtain data from two addresses

无法将一个套接字绑定(bind)到多个 IP 地址。

仍然可以并行处理多个套接字,而不需要多个线程或多进程。这是通过基于事件的架构和非阻塞套接字完成的,请参阅Non-blocking Sockets有关更多详细信息,请参阅 Python 文档。

关于python - 如何在不使用多线程的情况下绑定(bind)多个IP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59246870/

相关文章:

windows - 套接字 Hook /拦截/注入(inject)(Windows)

multithreading - OpenGL:单独线程上的 glClientWaitSync

java - 如何让线程等待特定条件

java - 如何在 java 中解析代理 socks 数据包?

python - 类型错误 : method() takes 1 positional argument but 2 were given

java - AtomicInteger 的嵌套方法调用在 java 中也是原子的吗

c# - 有没有办法指定在 tcpClient 中使用的本地端口?

python - 两个数据帧上列函数的高效 pandas 操作

python - 属性错误 : 'LinearSVC' object has no attribute 'classes_'

Python 笔记本 - 导入带有两个字符分隔符的数据文件会导致错误