Я столкнулся с некоторыми проблемами, которые мне нужны, чтобы найти лучший способ решить эту проблему.
вот в чем проблема -
У меня работает серверный код с сокетом, который прослушивает прием новых входящих соединений.
Затем я пытаюсь запустить клиент, у которого также есть сокет, который прослушивает прием новых входящих соединений.
Код клиента начинается с принятия нового соединения в дескрипторе файла прослушивающего сокета и получает новый дескриптор файла сокета для ввода-вывода.
Сервер делает то же самое и получает новый дескриптор файла сокета для ввода / вывода.
Примечание. Клиент еще не полностью подключен. Ему нужно получить несколько байтов с сервера и отправить несколько, прежде чем он сможет запуститься.
Затем я ввожу некоторые потери пакетов при сетевом соединении TCP / IP. Это приводит к определенным ошибкам (пример: системный вызов recv () в клиентском процессе не видит принятых байтов, а затем закрывает соединение с сокетом на стороне клиента, и связанный с ним новый дескриптор файла сокета закрывается.) Однако это оставляет клиентский процесс зависание, поскольку в FD_SET есть другие дескрипторы, но ни один из них не готов к вводу / выводу. Таким образом, pselect () возвращает 0 файловых дескрипторов, готовых для ввода / вывода. Клиент должен отправить и получить определенные байты через соединение, прежде чем он сможет начать работу.
Мой вопрос больше о том, что мне здесь делать?
Я исследовал опцию SO_KEEPALIVE, когда создавал новое сокетное соединение во время системного вызова accept (). Но я не думаю, что это решило бы мою проблему здесь, особенно если потеря сетевого пакета продолжается.
Должен ли я уничтожить клиентский процесс здесь, если я понимаю, что файловые дескрипторы не готовы для ввода-вывода и никогда не будут? Есть ли лучший способ приблизиться к этому?