Determining the moment a TCP connection is really been closed in C

198 views Asked by At

I need to perform some operations only after the time a TCP connection is fully closed, that's to say - all the data segments, as well as the finishing routine (FIN-ACK or RST) have been performed and done, and no packets will be sent on the wires.

Since closesocket() is not synchronous and could return before a full close of the connection and socket, I've used the SO_LINGER option to get the moment of closing.

According to the instructions in the MSDN for closesocket, and to the fact that my socket is non-blocking (and thus asynchronous), I wrote this code:

int ret;

/* config 2 secs of linger */
struct linger lng = {1, 2};
setsockopt(s, SOL_SOCKET, SO_LINGER, (const char*)&lng, sizeof(lng));

/* graceful close of TCP (FIN-ACK for both sides) */
shutdown(s, SD_BOTH);

/* linger routine for asynchronous sockets according to msdn */
do {

     ret = closesocket(s);

} while (ret == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK);

/* my code to be run immediately after all the traffic */
printf("code to run after closing");

However, the closesocket call returns zero (success; instead of getting into the loop) and I see in Wireshark that my final printing is called before all the packets were sent, so - it looks like the linger isn't working.

By the way, the functions I used to open and connect the asynchronous socket were socket(), WSAIoctl() and its lpfnConnectEx() callback.

What's the reason that the lingered closesocket return before a full finish of the TCP connection? Is there a solution?

0

There are 0 answers