使用Python广播和接收数据

时间:2013-06-11 21:46:27

标签: python networking udp

我正在尝试广播一些数据并使用python接收它。 这是我想出的代码。

from socket import *
import threading

class PingerThread (threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run (self):
        print 'start thread'
        cs = socket(AF_INET, SOCK_DGRAM)
        cs.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        cs.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
        cs.sendto('This is a test', ('192.168.65.255', 4499))

a = PingerThread() 
a.start()

cs = socket(AF_INET, SOCK_DGRAM)
data = cs.recvfrom(1024) # <-- waiting forever

然而,代码似乎永远等待cs.recvfrom(1024)。什么可能是错的?

2 个答案:

答案 0 :(得分:6)

代码中有三个问题。

  1. 听众没有约束力。
  2. 打开的套接字未关闭。
  3. 有时,线程产生的速度很快,以至于监听器只是错过了广播数据。
  4. 这是修改后的工作代码。

    from socket import *
    import time
    import threading
    
    port = 4490
    class PingerThread (threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
    
        def run (self):
            print 'start thread'
            cs = socket(AF_INET, SOCK_DGRAM)
            cs.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
            cs.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
    
            time.sleep(0.1) # issue 3 solved
            cs.sendto('This is a test', ('192.168.65.255', port))
    
    a = PingerThread()
    a.start()
    
    cs = socket(AF_INET, SOCK_DGRAM)
    try:
        cs.bind(('192.168.65.255', port)) # issue 1 solved
    except:
        print 'failed to bind'
        cs.close()
        raise
        cs.blocking(0)
    
    data = cs.recvfrom(20)  
    print data
    cs.close() # issue 2 solved
    

答案 1 :(得分:1)

您的主题可能会在>开始收听之前发送数据。

在线程中添加一个循环来解决问题

from socket import *
import threading
import time

class PingerThread (threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run (self):
        for i in range(10):
          print 'start thread'
          cs = socket(AF_INET, SOCK_DGRAM)
          cs.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
          cs.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
          cs.sendto('This is a test', ('192.168.1.3', 4499))
          time.sleep(1)

a = PingerThread() 
a.start()


cs = socket(AF_INET, SOCK_DGRAM)
try:
    cs.bind(('192.168.1.3', 4499))
except:
    print 'failed to bind'
    cs.close()
    raise
    cs.blocking(0)
data = cs.recvfrom(1024) # <-- waiting forever
print data