Ваши инстинкты были верны для использования shutdown()
, однако вы не использовали его правильно для этого.
Предположительно, вы пытаетесь shutdown()
с SHUT_WR
или SHUT_RDWR
.Когда вы закрываете направление записи, как это происходит, ваша сторона соединения уведомляет одноранговый узел с FIN
- указывая, что больше никаких данных не будет поступать с вашей стороны.Это приведет к тому, что recv()
на другой стороне будет указывать чистый конец файла в соединении, что в данном случае не то, что вам нужно.
Вместо этого вы хотите использовать SHUT_RD
дляотключите только направление сокета чтение и держите его открытым для записи.Это не будет немедленно уведомлять однорангового узла - но если одноранговый узел отправляет какие-либо данные после этой точки, ваша сторона ответит RST
, чтобы сообщить одноранговому узлу, что некоторые данные были потеряны - они не были замечены вашим клиентским приложением.
(Таким образом, чтобы обеспечить сброс соединения, вам необходимо убедиться, что сервер будет пытаться что-то отправить вам - вам может понадобиться сначала что-то отправить, а затем завершить чтение).