【问题标题】:How can I bind more than one IP without using multithreading?如何在不使用多线程的情况下绑定多个 IP?
【发布时间】:2019-12-09 10:28:00
【问题描述】:

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

我的代码如下:

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?

【问题讨论】:

    标签: python multithreading sockets ip


    【解决方案1】:

    ..只需创建一个可以从两个地址获取数据的套接字

    一个套接字不能绑定到多个 IP 地址。

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

    【讨论】:

    • One (socket) cannot bind a socket to multiple IP addresses.One can still handle multiple sockets in parallel?一个socket可以处理多个socket?如果是我的代码,我该怎么做?现在我的代码(具有多线程的本地代码)创建 2 个套接字,计算每个套接字的比特率。目前IS_ALL_GROUPS 设置为 false - 结果是每个线程为地址提供唯一的比特率。如果参数设置为 true,它会打印两次相同的两个地址的总和结果。我想得到这个但不使用多个线程。
    • @kaszankabanka:请遵循我明确链接到的文档。其他示例参见herehere
    猜你喜欢
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    相关资源
    最近更新 更多