我正在尝试广播一些数据并使用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)
。什么可能是错的?
答案 0 :(得分:6)
代码中有三个问题。
这是修改后的工作代码。
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