← index #4227Issue #8688
Related · medium · value 1.362
QUERY · ISSUE

ESP32 cannot send and receive UDP packets to itself

openby goatchurchprimeopened 2018-10-10updated 2022-03-30
port-esp32

It seems you can a UDP packet on a PC to itself, but you can't send a UDP packet from an ESP32 to itself:

import network, socket

# Create access point for the phone to log onto
si = network.WLAN(network.AP_IF) 
si.active(True)       
print("Wifi is: ESP_%X%X%X" % tuple(si.config("mac")[-3:]))
print(si.ifconfig())

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(3)
port = 9099
ipnum = "192.168.4.1"
s.bind((ipnum, port))   

s.sendto(b"An ESP32 UDP Packet", (ipnum, port))
print(s.recvfrom(100))  # <--- this times out

response is:

Wifi is: ESP_8C1FB2
('192.168.4.1', '255.255.255.0', '192.168.4.1', '0.0.0.0')

Traceback (most recent call last):
File "<stdin>", line 16, in <module>
OSError: [Errno 110] ETIMEDOUT

However, when I connect my PC to the ESP_8C1FB2 hotspot then I can run the following:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.settimeout(3)
port = 9099
ipnum = "192.168.4.2"
s.bind((ipnum, port))   

s.sendto(b"A PC UDP Packet", (ipnum, port))
print(s.recvfrom(100))

response is:

(b'A PC UDP Packet', ('192.168.4.2', 9099))

I am able to send and receive UDP packets between the PC and the ESP32

  • PC: s.sendto(b"A PC UDP Packet", ("192.168.4.1", port)); print(s.recvfrom(100)))
  • ESP32: s.sendto(b"An ESP UDP Packet", ("192.168.4.2", port)); print(s.recvfrom(100)))

The socket.bind function seems to have to be to the device's own IPnumber. Fortunately this is quite predictable when working from the ESP's hotspot.

CANDIDATE · ISSUE

ESP8266 v1.18 Unreliable UDP Receiving From Broadcast Address (ex 192.168.1.255)

closedby PsuFanopened 2022-05-21updated 2024-09-08
bugneeds-info

Anyone else having issues receiving UDP packets? I can send 10-20 packets and only receive one packet. I send them with another esp or with my computer and can see the packets in Wireshark but hardly any are received with the 8266. It seems to be substantially worse when I send to the broadcast (ex 192.168.1.255) vs directly to the esp IP address. Should I be using a multicast address instead? Not sure what the differences are.

socket = socket(AF_INET, SOCK_DGRAM)
socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
socket.bind(('', 1011))
socket.setblocking(False)

while True:
	try:
		data, addr = self.socket.recvfrom(1024)
		print('Recv Data From %s' % str(addr))
	except OSError as err:
		if err.args[0] != 11:
			print(err)

Keyboard

j / / n
next pair
k / / p
previous pair
1 / / h
show query pane
2 / / l
show candidate pane
c
copy suggested comment
r
toggle reasoning
g i
go to index
?
show this help
esc
close overlays

press ? or esc to close

copied