Detecting a remote disconnection on a TCP socket

cancel
Showing results for 
Search instead for 
Did you mean: 

Detecting a remote disconnection on a TCP socket

1,641 Views
FredericoPrado
Contributor II

Hello.

 

I'm starting to use MQX and I am at a loss about the procedure to detect a remote disconnection once  a TCP link has been established.

 

As far as I understood you can establish a connection by either actively calling connect(), or by calling listen() then accept(), once the connection has been established anytime a data packet arrives addressed to that socket it can be detected by pooling RTCS_selectall(0).

 

My problem is that I haven't found a way to identify when these events are generated by a remote disconnection or by data arriving.

 

Here is the code snippet of my current procedure:

 

 

for (;;) {   sock = RTCS_selectall(0);   if (sock == listensock) {      // Connection requested; accept it.       rlen = sizeof(raddr);      tsock = accept(listensock, &raddr, &rlen);      if (tsock == RTCS_SOCKET_ERROR) {          printf("\naccept() failed, error 0x%lx",                  RTCS_geterror(listensock));          continue;      }   }   else if (sock == tsock) {      // Sends back a message and increments message index      recv(tsock, buffer, 256, 0);      send(tsock, Msg[index], strlen(Quotes[index]) + 1, 0);      index++;   }}

Once I remotely disconnect tsock, it keeps returning as a result of RTCS_selectall(0), but as I am unable to identify this is not an incoming message I keep executing the recv/send routine unaware that the socket is broken by the remote peer.

 

I would like to both know the correct procedure to detect such a disconnection as well as the correct procedure to close the socket gracefully in this case.

 

Thank you in advance,

 

Frederico



 

 

Labels (1)
Tags (1)
0 Kudos
4 Replies

382 Views
CompilerGuru
NXP Employee
NXP Employee

I don't know MQX, but typically with socket programming a closed connection is signaled by recv returning 0 as number of bytes read. There is usually also no guarantee of how many bytes were read in a single recv, it may return with fewer than the passed in buffer size.

 

Daniel

0 Kudos

382 Views
martinpi
Contributor III


If this is true, how do I distinguish between a closed connection and a connection that is still open but no new data arrived?

0 Kudos

382 Views
Martin_
NXP Employee
NXP Employee

Typically in an RTOS system the recv() call is blocking, so if the connection is established and no new data arrived, the task is just blocked in the recv() call.

In RTCS, recv() returns -1 (RTCS_ERROR) when remote peer disconnects (sends FIN to us). The socket error code is set to RTCSERR_TCP_CONN_CLOSING and you can read it from the socket by RTCS_geterror().

Martin

0 Kudos

382 Views
martinpi
Contributor III

From Martin to Martin:

Thanks a lot! :smileyhappy:

0 Kudos