У меня есть сервер AF_INET
/ SOCK_STREAM
, написанный на C, работающий на Android / Linux, который выглядит примерно так:
...
for (;;) {
client = accept(...);
read(client, &message, sizeof(message));
response = process(&message);
write(client, response, sizeof(*response));
close(client);
}
Насколько я знаю, вызов close не должен прерывать соединение с клиентом немедленно, но, очевидно, так и происходит: клиент сообщает "Сброс соединения по одноранговому узлу", прежде чем он сможет прочитать ответ сервера.
Если я вставлю задержку между write()
и close()
, клиент сможет прочитать ответ, как ожидалось.
Я получил подсказку, что это может быть связано с параметром SO_LINGER
, но я проверил его значение, и оба члена struct linger (l_onoff
, l_linger
) имеют значение ноль.
Есть идеи?