Skip to content

Instantly share code, notes, and snippets.

@ninedraft
Last active January 29, 2024 23:27
Show Gist options
  • Star 58 You must be signed in to star a gist
  • Fork 16 You must be signed in to fork a gist
  • Save ninedraft/7c47282f8b53ac015c1e326fffb664b5 to your computer and use it in GitHub Desktop.
Save ninedraft/7c47282f8b53ac015c1e326fffb664b5 to your computer and use it in GitHub Desktop.
Python udp broadcast client server example.

Python udp broadcast client-server example

⚠️ ❗ ATTENTION ❗ ⚠️

This gist is deprecated and will not be edited in the future. Consider visit ninedraft/python-udp repo. It will not be deleted, however.

⚠️ ❗ ATTENTION ❗ ⚠️

Works for python 3.7 and 2.7 for Mac OS and Linux(kernel>=3.9) hosts. If you'ra using linux(kernel<3.9), then use socket.O_REUSEADDR instead of socket.SO_REUSEPORT to share (host, port) between multiple clients and servers.

Tricks and traps:

import socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # UDP
# Enable port reusage so we will be able to run multiple clients and servers on single (host, port).
# Do not use socket.SO_REUSEADDR except you using linux(kernel<3.9): goto https://stackoverflow.com/questions/14388706/how-do-so-reuseaddr-and-so-reuseport-differ for more information.
# For linux hosts all sockets that want to share the same address and port combination must belong to processes that share the same effective user ID!
# So, on linux(kernel>=3.9) you have to run multiple servers and clients under one user to share the same (host, port).
# Thanks to @stevenreddie
client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
# Enable broadcasting mode
client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
client.bind(("", 37020))
while True:
# Thanks @seym45 for a fix
data, addr = client.recvfrom(1024)
print("received message: %s"%data)
import socket
import time
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
# Enable port reusage so we will be able to run multiple clients and servers on single (host, port).
# Do not use socket.SO_REUSEADDR except you using linux(kernel<3.9): goto https://stackoverflow.com/questions/14388706/how-do-so-reuseaddr-and-so-reuseport-differ for more information.
# For linux hosts all sockets that want to share the same address and port combination must belong to processes that share the same effective user ID!
# So, on linux(kernel>=3.9) you have to run multiple servers and clients under one user to share the same (host, port).
# Thanks to @stevenreddie
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
# Enable broadcasting mode
server.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# Set a timeout so the socket does not block
# indefinitely when trying to receive data.
server.settimeout(0.2)
message = b"your very important message"
while True:
server.sendto(message, ('<broadcast>', 37020))
print("message sent!")
time.sleep(1)
@ninedraft
Copy link
Author

@bpsib @tianxie1989 I've fixed the broadcast host.
Try this for now please
https://github.com/ninedraft/python-udp

@shehryar51088
Copy link

with your code how can I print IP Address Of Clients connected to SERVER,please help

@ninedraft
Copy link
Author

with your code how can I print IP Address Of Clients connected to SERVER,please help

There is no such thing as connection in UDP, and server doesn't see any clients. It basically throws packets in the network and receives no answers.

https://www.youtube.com/watch?v=FfvUxw8DHb0

@UgraNarasimha
Copy link

I tried with windows powershell, the client.py just blinks into oblivion and no message is received. Also I have a problem with breaking the function with CTRL+C since everything just freezes. Any tips to solve this?

@ninedraft
Copy link
Author

@UgraNarasimha I'll try to reproduce it
Please, add an issue here https://github.com/ninedraft/python-udp

@haskiindahouse
Copy link

haskiindahouse commented Jun 3, 2021

How I do it not in local network?
I'm trying do this:
client.bind(("broadcast_station_ip", 37020))
And I'm getting this:
Traceback (most recent call last): File "client.py", line 15, in <module> client.bind(("broadcast_station_ip", 37020)) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 228, in meth return getattr(self._sock,name)(*args) socket.error: [Errno 49] Can't assign requested address
For client.py I'm using macOS Big Sur 11.2.3 and for server.py I'm using Ubuntu 20.10.
It's work fine when:
client.bind(("", 37020))
and computers placed in local network.
If you have some idea or tips for solve this, please help me :)

@weihohoho
Copy link

Thank you for offer the code. I was runing the server and client codes on a group of remote machines. I wrote a powershell script to SSH into the server and client machines to start the python codes.
It seems the python codes freezes/hang the SSH every time. May I ask what is causing that and if there is a way around it? Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment