Во-первых, немного фона для объяснения мотивации: я работаю над очень простым TCP-зеркальным зеркалом TCP на основе select(), который позволяет двум брандмауэрам-клиентам косвенно общаться друг с другом. Оба клиента подключаются к этому серверу, и как только оба клиента подключены, любые TCP-байты, отправленные на сервер клиентом A, перенаправляются клиенту B и наоборот.
Это более-менее работает с одним небольшим успехом: если клиент A подключается к серверу и начинает отправлять данные до того, как клиент B подключился, серверу негде разместить данные. Я не хочу его буферизировать в ОЗУ, так как это может привести к использованию большого количества ОЗУ; и я не хочу просто отбрасывать данные, так как это может понадобиться клиенту B. Поэтому я выбираю третий вариант, который не должен выбирать() - для чтения в клиентском сокете, пока клиент B также не подключится. Таким образом, клиент A блокируется, пока все не будет готово.
Это более или менее работает, но побочный эффект не для выбора-для-чтения-готовности на клиентском соке состоит в том, что если клиент A решает закрыть свое TCP-соединение с сервером, сервер не получает уведомления о этот факт - по крайней мере, только до тех пор, пока не появится клиент B, и сервер окончательно выберет для чтения в клиентском сокете, прочитает все ожидающие данные и затем получит уведомление с закрытым сокетом (то есть recv() возвращает 0).
Я бы предпочел, чтобы у сервера был некоторый способ узнать (своевременно), когда клиент А закрыл свое TCP-соединение. Есть ли способ узнать это? Опрос был бы приемлемым в этом случае (например, я мог бы выбрать() просыпаться один раз в минуту и вызывать IsSocketStillConnected (носок) во всех сокетах, если такая функция существует).