如何返回由函数创建的socket并将其传递给另一个?

2024-05-19 01:44:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想定义一个函数来创建套接字,将套接字绑定到特定的地址和端口,从源代码(不间断地)获取数据,然后返回这个套接字,这样我就可以在其他函数中使用它了。有可能吗?如果是,我该怎么做

我想多线程socket_analyser,它是否也意味着多线程socket_receiver

问题是在调用socket_creator之后,函数不会返回sock。当我试图把它传递给socket_analyser中的socket_receiver时,它给参数sock加下划线,表示它没有定义

我还试图在socket_creator(MCAST_GRP[0],MCAST_PORT)之后定义testsocket = sock,将其传递给socket_receiver(testsock, BUFFER_UDP),但是结果是一样的

import socket
import struct
import time
import threading


MCAST_GRP = ['239.0.1.104','239.0.1.105']
MCAST_PORT = 12345
BUFFER_UDP = 2048

def socket_creator(multicast_group, multicast_port):

    MCAST_GRP = multicast_group
    MCAST_PORT = multicast_port    
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)   
    sock.bind(('', MCAST_PORT))
    mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
    return sock
#testsocket = sock

def socket_receiver(sockett, bufferUDP):
    BUFFER_UDP = bufferUDP
    sock_rcv = sockett
    for x in range(10):       
        data, address = sock_rcv.recvfrom(BUFFER_UDP)
        totalSize += len(data)
    return totalSize

def socket_analyser(multicast_group, multicast_port, totalSize):
    print("_____.:|   Starting analysis!   |:._____\n")
    print("͞◌͞◌͞◌͞◌͞.:|   IP: {}    PORT: {}  |:.͞◌͞◌͞◌͞͞◌͞◌".format(multicast_group,multicast_port))    
    socket_analyser(sock, BUFFER_UDP)
    print(totalSize)
    totalSize = 0

socket_creator(MCAST_GRP[0],MCAST_PORT)
socket_creator(MCAST_GRP[1],MCAST_PORT)

t1 = threading.Thread(target=socket_analyser, args=(MCAST_GRP[0],MCAST_PORT,BUFFER_UDP, sock))
t2 = threading.Thread(target=socket_analyser, args=(MCAST_GRP[1],MCAST_PORT,BUFFER_UDP, sock))

t1.start()
t2.start()

t1.join()
t2.join()

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

提前谢谢你让我更接近解决方案


Tags: importportbuffergroupsocketsockudpcreator
1条回答
网友
1楼 · 发布于 2024-05-19 01:44:24

我在代码中看到了一些逻辑问题

  1. sock对象范围仅在socket\u creator内部,因此除非您将返回结果接收到另一个变量中,否则它在外部不可用
  2. 您正在将未定义的变量sock传递给analyzer方法
  3. socket\u analyzer方法中递归调用socket\u analyzer方法

我只是修改了一些东西

def socket_analyser(BUFFER_UDP, sock):
    socket_receiver(sock, BUFFER_UDP)
    print(BUFFER_UDP)


sock1 = socket_creator(MCAST_GRP[0],MCAST_PORT)
sock2 = socket_creator(MCAST_GRP[1],MCAST_PORT)

t1 = threading.Thread(target=socket_analyser, args=(BUFFER_UDP, sock1))
t2 = threading.Thread(target=socket_analyser, args=(BUFFER_UDP, sock2))

相关问题 更多 >

    热门问题