This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

TCP-server cannot accept clients

Hi!

I'm developing a TCP server running on the nRF9160, but there seem to be a problem with accepting clients. The code is very simple, just calls to socket, bind, listen, accept. But the accept fails as soon as a client tries to connect. ERROR on accept returned -1, errno: 134. I have pasted the code below.

I'm connected to a Cat-M network before I start the server and I have successfully connected from the nRF9160 to another server. But I cannot get the nRF9160 to act as a server. Can you please investigate this?

I'm using:
fw-nrfconnect-nrf tag v1.1.0
Zephyr tag v2.0.99-ncs1
nrfxlib v1.1.0
Modem firmware: 1.1.0

int parentfd; /* parent socket */
int childfd; /* child socket */
int portno; /* port to listen on */
int clientlen; /* byte size of client's address */
struct sockaddr_in serveraddr; /* server's addr */
struct sockaddr_in clientaddr; /* client addr */

portno = 8080;
parentfd = socket(AF_INET, SOCK_STREAM, 0);
if (parentfd < 0) {
	LOG_ERR("ERROR opening socket");
	return;
}

memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = INADDR_ANY;
serveraddr.sin_port = htons((unsigned short)portno);

if (bind(parentfd, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0) {
	LOG_ERR("ERROR on binding");
	return;
}

if (listen(parentfd, 5) < 0) {/* allow 5 requests to queue up */ 
	LOG_ERR("ERROR on listen");
	return;
}

while (1) {
	LOG_INF("TCP server waiting for client...");

	childfd = accept(parentfd, (struct sockaddr *) &clientaddr, &clientlen);
	if (childfd < 0) {
		LOG_ERR("ERROR on accept returned %d, errno: %d", childfd, errno);
		LOG_ERR("Closing server");
		close(parentfd);
		break;
	}

	LOG_INF("server established connection");
	
	tcp_handle_client(childfd);

	close(childfd);
} 

Kind regards

Mattias Eriksson

  • We are migrating from our current solution (using 2g/3g/4g) where our cloud/server connects to devices and pushes data once in a while. This infrastructure is not something we can change in a heartbeat.

    We also want to be able to connect a telnet shell to the devices every once in a while for development, debugging and configuration.

    It sounds promising that it all looks good from the modems point of view.

    It does not sound good that the server support in bsdlib "is not very strong". I think it is odd that you would not support it, why would server be so much more strange or difficult than client? Is it something you will fix or will you stop supporting it?

    Best regards

  • I have asked the bsdlib team for clarification and will get back to you when I get an answer.

    The reason for why the server functionality is not as tested as the client functionality is that in most use cases, the nRF91 will be the client, and the one to initiate the contact. This is both due to power management concerns, but also due to the way the LTE network is implemented. From a power management perspective, it is not optimal to be connected to the network at all times and listen for incoming connections. And from the network side, the device is often heavily sandboxed behind NAT and firewalls, controlled by the network operators. All this means that the server functionality is not much used, and therefore not given as much attention as the client functionality.

    That said, as we do list it as a supported feature, and provide the necessary APIs to use it, it should definitely work. If it is a bug that is causing your problems, I expect that it will be fixed, and I do not expect that we will drop support for TCP server functionality. But, when it comes to support of features etc. your Regional Sales Manager would be more appropriate than a DevZone case. Anyway, as I said, I have asked the bsdlib team to look into your problems, and will get back to you when I get a reply from them.

  • Thank you.

    I understand that this is not the most common use case. NAT is not a problem for us since our devices are not public on the internet, we have VPN to our network providers.

    We look forward hearing what the bsdlib team says.

    Best regards

  • Hi, and sorry for the long wait.

    It took some time to find someone at the bsdlib team that could answer, and he needs to check with the modem team, so it will take a bit longer to get a definitive answer.

    The answer I have gotten so far is that the nRF9160 should support server functionality in theory, but it has not been much tested and there could also be some issues on the network side.

    Thank you for your patience, and best regards,

    Didrik

Related