Hello everyone.
I'm wirting an application for an LPC Controller using Keil/Arm MDK and BSD Sockets.
In the application I close a TCP listen socket and want to reopen it a short time later. I get an Error trying after closing it and trying to bind the newly created Socket: BSD_EADDRINUSE (-17). Seems to indicate that it is in something of a TIME_WAIT state, so I can't reuse that port until the set time passed.
This would be perfectly fine for a connection socket. But for a listen socket, I don't see the point. After closing it no connection would be accepted any more anyway. setsockopt() exists but SO_REUSEADDR is not implemented by the MDK. So how would I try to work around this?
Thanks for any help.
sorry that I didn't notice you were asking BSD socket, instead of native TCP socket.
The error "BSD_EADDRINUSE" happens, when the local socket with a specific port is currently being used, which cannot be reused.
If you read through the example code you referred to above, you will see closing the "parent socket" is not meant for you to reuse the socket bound to the same address and port.
Hello Chen,
actually, what I tried to do is establish several TCP connections with my device being the server. (Closing and re-opening the socket was an attempted workaround.) With a BSD socket, this doesn't work. The listen socket queues incoming connection requests while a connection is active but I can't establish a second connection by calling accept() until the first connection is closed. (Conforming to https://www.keil.com/pack/doc/mw/Network/html/group__using__network__sockets__bsd__func.html#ga18e88467cfdbc3c361d53b9f928a87ab)
In https://www.keil.com/pack/doc/mw6/Network/html/using_network_sockets_tcp.html it says "The Network Component can handle multiple connections on the same port." and further down the page "Server applications often require to be able to accept several TCP connections from clients on the same port. The handling of these multiple connections must be implemented in the user application." This document is for Version 6 of the Network Component. I couldn't find anything similar for Version 7.
Is it still possible to have multiple connections via one listening socket opened at the same time using the TCP Socket API in Version 7 of the Network Component?
Kind Regards.
Then you should consider using native TCP socket APIs instead of BSD socket
Please install and check the CMSIS-Driver_Validation pack and see SockServer.c in the .\Tools\SockServer\Embedded\MDK\Source folder.
This server performs several services (ECHO, DISCARD, CHARGEN, ..) using BSD sockets. The StreamServer thread is waiting for any connection using the select() function. StreamServer then accepts the connection and creates a new thread that manages the connection until it is closed. The current configuration can accept 5 simultaneous connections: two for ECHO, two for CHARGEN and one for the DISCARD service.
I believe this is what you are looking for.
Solved! Finally.
The BSD Sockets API was working all the time. I just had to understand that after accepting a connection request it was NOT instantly removed from the queue that wast started with listen(<socket>, <queue size>);. So to have two connections simultaneously, 1 didn't do.
I'll mark Franc's answer as the accepted one since that led me to realize my error.
Thank both of you very much.