Определение момента, когда TCP-соединение действительно закрыто в C

Мне нужно выполнять некоторые операции только после того, как TCP-соединение полностью закрыто, то есть все сегменты данных, а также завершающая процедура (FIN-ACK или RST) были выполнены и выполнены, и пакеты не будут отправлено по проводам.

поскольку closesocket() не является синхронным и может вернуться до полного закрытия соединения и сокета, я использовал SO_LINGER возможность получить момент закрытия.

В соответствии с инструкциями в MSDN для closesocket и тем фактом, что мой сокет не является блокирующим (и, следовательно, асинхронным), я написал этот код:

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");

Тем не менее, вызов closesocket возвращает ноль (успех; вместо того, чтобы попасть в цикл), и я вижу в Wireshark, что моя окончательная печать вызывается до того, как все пакеты были отправлены, поэтому - похоже, что задержка не работает.

Кстати, функции, которые я использовал для открытия и подключения асинхронного сокета, были socket(), WSAIoctl() И его lpfnConnectEx() Перезвоните.

Какова причина того, что задержанный closesocket возвращается до полного завершения TCP-соединения? Есть ли решение?

0 ответов

Другие вопросы по тегам