Вы можете просто попробовать SO_LINGER через опцию setsockopt (2) с таймаутом 0. Таким образом, когда вы закрываете сокет, принудительно закрывается, отправляя RST вместо перехода в режим закрытия FIN/ACK.
Назначение опции SO_LINGER заключается в управлении отключением сокета при вызове функции close (2). Этот параметр применяется только к протоколам, ориентированным на соединение, таким как TCP.
Поведение ядра по умолчанию заключается в том, чтобы позволить функции close (2) немедленно вернуться к вызывающему. Любые неотправленные данные TCP/IP будут передаваться и поставляться, если это возможно, но никаких гарантий не предусмотрено. Поскольку вызов close (2) немедленно возвращает управление вызывающему абоненту, приложение не знает, действительно ли был доставлен последний бит данных.
Опция SO_LINGER может быть включена в сокете, чтобы приложение блокировалось в вызове close (2) до тех пор, пока все конечные данные не будут доставлены на удаленный конец. Кроме того, это гарантирует абоненту, что оба конца подтвердили нормальное выключение сокета. В противном случае отображается указанный тайм-аут опции, и ошибка возвращается вызывающему приложению.
Один заключительный сценарий может быть применен с использованием различных значений опции SO_LINGER. Если вызывающее приложение хочет немедленно прекратить связь, соответствующие значения могут быть установлены в структуре задержки. Затем вызов для закрытия (2) инициирует прерывание линии связи, отбрасывание всех ожидающих данных и немедленное закрытие сокета.
Похоже, что серверный процесс QEMU не полностью прочитал содержимое последней отправки(). Что произойдет, если вы переключитесь на использование TCP вместо сокетов домена? Есть ли разница в поведении? – user590028
Поведение, которое я только что описал, не воспроизводится на 100%, и, к сожалению, использование TCP не является для меня вариантом. – mgamal
Можем ли мы видеть вывод 'netstat -ap'? – user590028