Хорошо, так что это кажется довольно простой проблемой, но я чувствую, что я прочитал каждую статью по программированию сокетов, которую могу найти, и не нашел удовлетворительного ответа. Позвольте мне сначала описать систему, которую я программирую. Я извиняюсь, но я должен быть очень расплывчатым для целей NDA, но этого будет достаточно, чтобы ответить на мой вопрос.
Я пишу центральный многопоточный сервер C с пулом потоков. Есть два типа клиентов, типа A и типа B. Есть тысячи каждого. Тип A - это работники, которые делают что-то для типа B. Тип A постоянно обновляет информацию о себе на сервере (скажем, каждые 15 секунд). Тип B общается с сервером только тогда, когда ему нужно что-то сделать, после чего сервер выбирает клиента A и назначает ему задание. Это происходит примерно 24/7 и очень чувствительно ко времени.
Я решил использовать постоянную модель TCP - это означает, что как только B запрашивает выполнение работы, сервер может немедленно отправить информацию в A, не дожидаясь, пока соответствующий A подключится к сервер. Кроме того, если каждый А разговаривает с сервером каждые 15 секунд, установление соединений потребует много времени.
Если A, выбранный сервером, недоступен, ему нужно как можно скорее выбрать новый A, так как B очень нетерпелив.
Мой вопрос: как мне узнать, разорвалось ли соединение? Я не говорю о закрытой розетке, но просто больше не подключен. Например, B1 хочет выполнить работу, сервер выбирает A1 и отправляет ему запрос. Однако кто-то решает перерезать кабель Ethernet. Я не могу позволить, чтобы сервер успешно отправлял данные на А1 до истечения времени ожидания соединения. Могу ли я пинговать клиента перед тем, как отправлять ему сообщения или что-то еще? Будет ли это слишком большой задержкой? Что можно сделать?