Когда я делаю неблокируемое подключение к loopback-адресу из iOS Simulator (который, вероятно, использует тот же стек TCP, что и Mac и FreeBSD), я вижу, что соединение всегда удается, даже если серверный процесс не запущен.Неблокируемое соединение с адресом loopback (127.0.0.1 или localhost)
Я обнаружил, что соединение выполнено с помощью select() с нулевым таймаутом. Итак, до тех пор, пока select() возвращает 0, я предполагаю, что соединение выполняется, если оно возвращает -1, я терпит неудачу с ошибкой, и если он возвращает 1, сокет готов к чтению (поскольку сервер должен был ответить) , и я начинаю читать после сообщения о том, что соединение выполнено успешно.
Это хорошо работает для всех адресов, кроме петли. В loopback select() всегда возвращает 1, даже если сервер не работает. Итак, я начинаю читать, что терпит неудачу, и я справляюсь с этим. Но я должен был обнаружить это через select()!
Я на самом деле получаю EINPROGRESS от connect(). Я еще раз проверю и дам вам знать. – Plumenator
Yup, EINPROGRESS. – Plumenator
Прошу прощения за то, что вы не проверяли результат 'connect'. Кстати, вы выбираете для чтения или для написания? По крайней мере, FreeBSD 'connect (2)' manpage, похоже, указывает, что нужно выбрать для записи. – Grrrr