Socketconnection listen to wrong Port

Hi there,

i have a strange Problem with openmv cam with wifishield.

i want to have two services running and listen for connections on there ports.
one is modbustcp - on port 502 and one is a webserver on port 8080

always when i connect from modbus (port 502), the webserver (port 8080) on get the data.

to clearify i have written a short example to try to highlight the problem

Here i open two Ports, on 8080 and 9090. When i point my Browser to 8080 the data is received in “webserverconn”, but also when i point my browser to 9090 its received in “webserverconn”, but it should be in “webserverconn2”

Does have anybody an idea why this is like this?

Examplecode

import sensor
import utime
import network
import socket
import gc
import uos
import pyb
import json


SSID = "asdf"  # Network SSID
KEY = "asdf"  # Network key
HOST = ""  # Use first available interface
PORT = 8080  # Arbitrary non-privileged port
MBPORT = 502


# Init wlan module and connect to network
print("Trying to connect... (may take a while)...")
wlan = network.WINC()
print("FWVersionWLAN:" + str(wlan.fw_version()))
print("EmpfangWLAN:" + str(wlan.rssi()))

wlan.connect(SSID, key=KEY, security=wlan.WPA_PSK)

# We should have a valid IP now via DHCP
print(wlan.ifconfig())

# Create server socket
webservsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
webservsocket.bind([HOST, PORT])
webservsocket.listen(5)
webservsocket.setblocking(False)



webservsocket2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
webservsocket2.bind([HOST, 9090])
webservsocket2.listen(5)
webservsocket2.setblocking(False)



while True:

    try:
        webservconn, webservaddr = webservsocket.accept()
        webservconn.settimeout(3.0)

        webservrequest = webservconn.recv(2048).decode('utf-8')

        if len(webservrequest) > 0:
            print(webservsocket.getsockname())
            print("Webserverreq")
            print(webservconn)
            print(str(webservaddr))
            print(len(webservrequest))

        webservconn2, webservaddr2 = webservsocket2.accept()
        webservconn2.settimeout(3.0)

        webservrequest2 = webservconn2.recv(2048).decode('utf-8')
        if len(webservrequest2)  > 0:
            print(webservsocket2.getsockname())
            print("Webserverreq 2")
            print(webservconn2)
            print(str(webservaddr2))
            print(len(webservrequest2))
    except:
        None


Since you are doing those both one after another and there’s a timeout that’s set… it’s just going to return from the first always right?

Yes its always from the first…

I’m saying the first one will always block and then timeout.

i have set the sockets to non blocking mode - so both can be accessed from programm if you mean that?

i am wondering i receive requests on port 8080 on “webservconn” and also 9090 on “webservconn” instead of “webservconn2”
so both ports are working but i reaceive data always on port 8080 also if i request on 9090…

Hi, I debugged your code. The issue is that you are using try catch in a way that won’t work.

while True:

    try:
        webservconn, webservaddr = webservsocket.accept()
        webservconn.settimeout(3.0)

        webservrequest = webservconn.recv(2048).decode('utf-8')

        if len(webservrequest) > 0:
            print(webservsocket)
            print("Webserverreq")
            print(webservconn)
            print(str(webservaddr))
            print(len(webservrequest))
    except OSError:
        None

    try:
        webservconn2, webservaddr2 = webservsocket2.accept()
        webservconn2.settimeout(3.0)

        webservrequest2 = webservconn2.recv(2048).decode('utf-8')
        if len(webservrequest2)  > 0:
            print(webservsocket2)
            print("Webserverreq 2")
            print(webservconn2)
            print(str(webservaddr2))
            print(len(webservrequest2))
    except OSError:
        None

Do something like this. What you were doing before didn’t isolate the two sockets from each other.

Also, you need to set the re-use socket option for your sockets:

webservsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
webservsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
webservsocket.bind([HOST, PORT])
webservsocket.listen(5)
webservsocket.setblocking(False)



webservsocket2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
webservsocket2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
webservsocket2.bind([HOST, 9090])
webservsocket2.listen(5)
webservsocket2.setblocking(False)

Please never write except without an exception type. This breaks the IDE debug hooks. It cannot stop your script if you do that.

Thank you very much for checking this for me. I will try it like this.