I've encountered an unusual behavior with Python's HTTPServer. My computer has both Ethernet and WiFi connections active simultaneously. I intended for the server to exclusively respond to incoming requests from the WiFi interface, so I configured it accordingly as described below. However, I've encountered an issue where requests are not being served when the Ethernet cable is connected. Strangely enough, when I disconnect the cable, requests are handled successfully.
I suspect that this issue may be related to interface priorities, but I'm not entirely sure. Is there a way to work around this problem? It's worth noting that the Ethernet connection is used for remote control, while the WiFi is dedicated to managing devices within a separate network.
Here is the result for ipconfig:
Ethernet adapter Ethernet:
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::5edd:...
IPv4 Address. . . . . . . . . . . : 192.168.0.29
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.0.1
Wireless LAN adapter Wi-Fi:
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::904:...
IPv4 Address. . . . . . . . . . . : 192.168.32.100
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.32.1
I want my server to listen on the WiFi, so I do this:
import socket
from http.server import BaseHTTPRequestHandler, HTTPServer
addr = ('192.168.32.100', 3101)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(addr)
sock.listen()
Then I run several threads with this code:
httpd = HTTPServer(addr, BaseHTTPRequestHandler, False)
# Prevent the HTTP server from re-binding every handler.
# https://stackoverflow.com/questions/46210672/
httpd.socket = sock
httpd.server_bind = self.server_close = lambda self: None
httpd.serve_forever()
EDIT: following @Emmanuel-BERNAT response, I'm adding here the result for route print:
Interface List
3...c0 25 a5 c8 cf ea ......Intel(R) Ethernet Connection (17) I219-LM
12...70 a8 d3 d5 d5 ff ......Microsoft Wi-Fi Direct Virtual Adapter
4...72 a8 d3 d5 d5 fe ......Microsoft Wi-Fi Direct Virtual Adapter #2
18...70 a8 d3 d5 d5 fe ......Intel(R) Wi-Fi 6E AX211 160MHz
10...70 a8 d3 d5 d6 02 ......Bluetooth Device (Personal Area Network)
1...........................Software Loopback Interface 1
===========================================================================
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.0.1 192.168.0.29 25
0.0.0.0 0.0.0.0 192.168.32.1 192.168.32.100 40
127.0.0.0 255.0.0.0 On-link 127.0.0.1 331
127.0.0.1 255.255.255.255 On-link 127.0.0.1 331
127.255.255.255 255.255.255.255 On-link 127.0.0.1 331
192.168.0.0 255.255.255.0 On-link 192.168.0.29 281
192.168.0.29 255.255.255.255 On-link 192.168.0.29 281
192.168.0.255 255.255.255.255 On-link 192.168.0.29 281
192.168.32.0 255.255.255.0 On-link 192.168.32.100 296
192.168.32.100 255.255.255.255 On-link 192.168.32.100 296
192.168.32.255 255.255.255.255 On-link 192.168.32.100 296
224.0.0.0 240.0.0.0 On-link 127.0.0.1 331
224.0.0.0 240.0.0.0 On-link 192.168.0.29 281
224.0.0.0 240.0.0.0 On-link 192.168.32.100 296
255.255.255.255 255.255.255.255 On-link 127.0.0.1 331
255.255.255.255 255.255.255.255 On-link 192.168.0.29 281
255.255.255.255 255.255.255.255 On-link 192.168.32.100 296
===========================================================================
Persistent Routes:
None
IPv6 Route Table
===========================================================================
Active Routes:
If Metric Network Destination Gateway
1 331 ::1/128 On-link
3 281 fe80::/64 On-link
18 296 fe80::/64 On-link
18 296 fe80::904:e4c2:.../128 On-link
3 281 fe80::5edd:a253:.../128 On-link
1 331 ff00::/8 On-link
3 281 ff00::/8 On-link
18 296 ff00::/8 On-link
===========================================================================
Persistent Routes:
None
Seems to me that it's a network config problem. You have two interfaces but both have default gateways. When a packet reach your server, it won't necessarily answer using the same network. I guess your ethernet card has a "Metric" (=priority) inferior to the Wi-Fi card. You can check this with the command
route print. If this is the case and if the ethernet network is unable to reach the source, your answer packet will be lost.Does the other devices use the same subnet (192.168.32.0/24) on the Wi-Fi side ?