Вы закрыли канал и все еще пытаетесь его использовать.
Есть несколько проблем с вашим кодом.
Во-первых, ваш тест на EOS неисправен. Удалить тест limit() == 0
. Это не указывает на EOS, это просто указывает на чтение нулевой длины, которое может происходить в неблокирующем режиме в любое время. Это не значит, что узел закрыл свой конец соединения, и это не значит, что вы должны закрыть свой конец.
Во-вторых, закрытие канала также закрывает сокет. Вы должны закрыть только канал, а не сокет.
В-третьих, закрытие канала отменяет ключ. Вам не нужно следовать каждому закрытию с отменой.
Возможно, вам также не удалось проверить, является ли ключ готовности действительным в цикле выбора, прежде чем его использовать, например, для чтения.
Я по-прежнему удивлен, удивлен и ошеломлен заявлением в другом месте в этой теме, что «исходный код неверен» при некоторых обстоятельствах.