Информация об изменениях

Сообщение RST на клиенте после socketclose на сервере от 11.04.2018 14:31

Изменено 11.04.2018 20:07 tdiff

RST на клиенте после socketclose на сервере
Привет,

Клиент и сервер общаются по простому протоколу:

-- client
send()
send()
shutdown(SHUT_WR)
read()
...

-- server
read()
...
send()
closesocket()

При этом клиент после closesocket() периодически получает RST. В моём понимании, это означает, что на сервере в recv queue ещё лежат непрочитанные данные. Но:
1. если перед socketclose() сделать recv(), то он прочитает 0 байт.
2. проблема проходит, если перед closesocket() вызвать shutdown(SHUT_BOTH).

Как можно объяснить такое поведение?

Платформа Win 7.
RST на клиенте после socketclose на сервере
Привет,

Клиент и сервер общаются по простому протоколу:

-- client sends request
send()
send()
shutdown(SHUT_WR) -- starts waiting for a reply
read()
...

-- server accepts conn and reads request
read()
...
send(). -- writes reply
closesocket() --and immediately closes its socket

При этом клиент после closesocket() на сервере периодически получает RST. В моём понимании, это означает, что на сервере в recv queue ещё лежат непрочитанные данные. Но:
1. если перед socketclose() на сервере сделать recv(), то он прочитает 0 байт.
2. проблема проходит, если перед closesocket() на сервере вызвать shutdown(SHUT_BOTH).

Как можно объяснить такое поведение?

Платформа Win 7. SO_linger дефолтный.