Вы говорите, что не читаете правильное «состояние отмены», когда проверяете его? Это говорит о том, что вы неправильно синхронизируете флаг между вашими потоками.
Или вы просто не будете проверять состояние отмены, пока не получите новые данные? (Исходя из того, как вы описываете свои «циклы» tx / rx, в случаях как синхронизации, так и асинхронности вам придется получить новую дейтаграмму, прежде чем вы сможете проверить флаг «отмены»)
Если вы контролируете оба конца передачи данных, то любой конец (клиент или сервер), который хочет прервать, в идеале должен отправить специальную дейтаграмму на другой конец, чтобы остановить передачу - в противном случае другой конец попытается продолжить отправка / получение, не зная, что это само по себе. Поэтому, возможно, лучшим подходом было бы на самом деле отправить / получить дейтаграмму «отменить передачу», которая сообщала бы код TCP на обоих концах, которые вы хотите отменить. (т. е. вам не нужно иметь специальный флаг отмены, вы просто проверите, является ли дейтаграмма, которую вы собираетесь отправить или только что получили, дейтаграммой «отмена передачи»). Это позволит аккуратно и аккуратно закрыть оба конца.