简体   繁体   English

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

[英]How can I return socket created by function and pass it to another?

I would like to define function that creates socket, binds socket to specific address and port, get data from source(incessantly) and then return this socket so I could use it in other function. 我想定义一个函数,该函数创建套接字,将套接字绑定到特定的地址和端口,从源不断获取数据,然后返回此套接字,以便可以在其他函数中使用它。 Is it possible? 可能吗? If so, how can I do that? 如果是这样,我该怎么做?

I would like to multithread socket_analyser , does it imply multithreading socket_receiver also? 我想对socket_analyser使用多线程,是否也暗示对socket_receiver多线程?

The problem is that after invoking socket_creator , the function doesn't return sock . 问题在于,调用socket_creator ,该函数不会返回sock When I try to pass it to socket_receiver in socket_analyser it underline parameter sock saying it's not defined. 当我尝试将其传递给socket_receiver中的socket_analyser它在参数sock下划线表示未定义。

I also tried to define testsocket = sock just after socket_creator(MCAST_GRP[0],MCAST_PORT) to pass it to socket_receiver(testsock, BUFFER_UDP) however - the same result. 我也试图在socket_creator(MCAST_GRP[0],MCAST_PORT)之后定义testsocket = sock socket_creator(MCAST_GRP[0],MCAST_PORT)将其传递给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)

Thank you in advance for anything bringing me closer to the solution 预先感谢您为我提供的解决方案

I am seeing a couple of logical issues in the code 我在代码中看到了几个逻辑问题

  1. sock object scope is only inside socket_creator so it would not be available outside unless you receive the return result into another variable sock对象作用域仅在socket_creator内部,因此除非您将返回结果接收到另一个变量中,否则它在外部不可用
  2. You are passing an undefined variable sock to the analyzer method 您正在将未定义的变量袜子传递给分析器方法
  3. You are recursively calling socket_analyser method inside socket_analyser method 您正在递归调用socket_analyser方法中的socket_analyser方法

I just modified a few things to fix 我刚刚修改了一些要修复的东西

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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 我可以使用在python中另一个文件中创建的套接字工作吗? - Can I work with a socket I created in another file in python? 无法使创建的 python function 返回一个值,然后我可以在另一个计算中使用该值 - Can't make created python function return a value which I can then use in another calculation 如何将行的子集传递给自定义函数并返回列表? - how can I pass subset of rows to custom function and return a list? 将一个函数的返回传递给另一个 - pass return of a function into another 当 python 没有返回时,如何访问另一个 function 中的值? - How can I access value in another function when there is no return at python? 如何将类中函数的返回值传递给同一个类中的另一个函数? - How do I pass a return value in a function in a class to another function within the same class? 如果我在一个 function 中创建了小部件,我如何使用 PythonE460F8BEA5A9F5118 在另一个 function 中访问它们 - If I created widgets in one function, how can I access them in another function using Python Tkinter? 如何在 Python 3 中获取一个函数以返回我可以在另一个函数中使用的值? - How can I get a function in Python 3 to return a value that I can use in another function? 将return作为参数传递给另一个函数 - Pass return as parameter for another function 在Django中创建成功后,如何返回创建的数据 - How can I return the created data when created success in Django
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM