2014-04-05 18 views
12

Tôi có mã sau gửi gói udp được phát trong mạng con.Nhận gói phát sóng bằng Python

from socket import * 
s=socket(AF_INET, SOCK_DGRAM) 
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) 
s.sendto('this is testing',('255.255.255.255',12345)) 

Mã sau đây để nhận gói phát sóng.

from socket import * 
s=socket(AF_INET, SOCK_DGRAM) 
s.bind(('172.30.102.141',12345)) 
m=s.recvfrom(1024) 
print m[0] 

Sự cố là không nhận bất kỳ gói quảng bá nào. Tuy nhiên, nó đang nhận thành công các gói udp bình thường được gửi đến cổng đó.

Máy của tôi rõ ràng đã nhận được gói phát sóng mà tôi đã kiểm tra bằng cách sử dụng netcat.

$ netcat -lu -p 12345            
this is testing^C 

Vì vậy, vấn đề chính xác ở đâu?

+0

Bạn có thể muốn kiểm tra IP của mình vì tôi đã thử phương pháp do bạn cung cấp với IP của tôi và nó hoạt động hoàn hảo. trong khi câu trả lời được đưa ra bởi @John Zwinck cũng hoạt động tốt. – TheCreator232

Trả lời

19

Cố gắng liên kết với địa chỉ mặc định:

s.bind(('',12345)) 
+0

Tôi tin rằng, phải có không gian giữa các dấu ngoặc kép để nó hoạt động. '''' thay vì '''' – TheCreator232

+0

Điều đó thực sự hiệu quả! Điều gì xảy ra nếu có nhiều hơn một địa chỉ ip cho máy? – nitish712

+0

@ nitish712: nó sẽ lắng nghe tất cả các giao diện. –

10

tôi tin rằng các giải pháp được nêu trong câu trả lời chấp nhận giải quyết vấn đề này, nhưng không phải trong một cách chính xác một cách đúng đắn. Bạn không nên sử dụng IP giao diện thông thường, nhưng IP phát sóng được sử dụng để gửi tin nhắn. Ví dụ nếu ifconfig là:


addet inet: 10.0.2.2 Bcast: 10.0.2.255 Mặt nạ: 255.255.255.0
thì máy chủ nên sử dụng s.bind (('10.0.2.255', 12345)), không phải 10.0. 2.2 (trong trường hợp của OP, anh ta nên sử dụng 255.255.255.255). Lý do câu trả lời được chấp nhận hoạt động là vì '' yêu cầu máy chủ chấp nhận gói từ tất cả các địa chỉ, trong khi chỉ định địa chỉ IP sẽ lọc nó.

'' là búa, chỉ định địa chỉ phát sóng chính xác là dao mổ. Và trong nhiều trường hợp, mặc dù có thể không phải của OP, điều quan trọng là máy chủ chỉ lắng nghe địa chỉ IP được chỉ định (ví dụ bạn muốn chấp nhận yêu cầu từ mạng riêng - mã trên cũng sẽ chấp nhận yêu cầu từ bất kỳ mạng bên ngoài nào), để bảo mật mục đích nếu không có gì khác.

+0

Nếu bạn đang sử dụng chương trình phát sóng và không phát đa hướng, làm thế nào để bạn có thể phát sóng từ bất kỳ thứ gì khác ngoài mạng lớp 2 được kết nối trực tiếp? Trừ khi bạn có nghĩa là bạn chỉ muốn nghe các chương trình phát sóng trên một mạng cụ thể, như vpn? –

+0

@FilipHaglund miễn là bạn đang ở trong cùng một lớp 3 mạng (mạng con) mã trên sẽ hoạt động tốt. Phát sóng dựa trên IP là tính năng lớp mạng (lớp 3), không phải lớp liên kết (lớp 2). Nếu bạn muốn nhận các gói phát sóng từ bất kỳ giao diện được kết nối nào, câu trả lời được chấp nhận sẽ không sao. Làm rõ câu hỏi của bạn có thể giúp tôi trả lời bạn tốt hơn. –

0
s=socket(AF_INET, SOCK_DGRAM) 
s.bind(('',1234)) 
while(1): 
    m=s.recvfrom(4096) 
    print 'len(m)='+str(len(m)) 
    print 'len(m[0])='+str(len(m[0]))  
    print m[0] 

    print 'len(m[1])='+str(len(m[1]))  
    print m[1] 
+3

Chỉ trả lời bằng mã không phải là giải pháp tốt. Đọc [cách thực hiện] này (http://stackoverflow.com/help/how-to-ask) để thực hiện theo các nguyên tắc SO. – thewaywewere

Các vấn đề liên quan