I am trying to create a raw socket in Python that only listens for UDP packets:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP) s.bind(('0.0.0.0', 1337)) while True: print s.recvfrom(65535)
This needs to be run as root and creates a raw socket on port 1337, which listens for UDP packets and prints them whenever they are received; no problem.
Now let me make a small client to check if this works:
import socket c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) c.connect(('127.0.0.1', 1337)) c.send('message 1') c.send('message 2') c.send('message 3') c.send('message 4') c.send('message 5') c.send('message 6')
In sequence, only the first, third and fifth messages ( message 1 , message 3 and message 5 ) will pass and will be printed on the server output. The second, fourth and sixth messages are not displayed on the server output, and instead the client receives an exception:
>>> c.send('message 2') Traceback (most recent call last): File "<stdin>", line 1, in <module> socket.error: [Errno 111] Connection refused
Running this in Wireshark shows that it is receiving an ICMP response for "Destination unreachable". I was able to reproduce this on three different machines (although everything works on Linux). Am I missing something? Is this the expected behavior for UDP to drop packets sequentially, since the protocols used must be tolerant of packet loss? However, why packages will be deleted when they are sent via the local interface?
Binding the server to 127.0.0.1 instead of 0.0.0.0 has the same result.
Etienne perot
source share