Re[3]: "плохой" int connect
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 25.10.08 15:21
Оценка:
Здравствуйте, Evilguc, Вы писали:

E>Здравствуйте, netch80, Вы писали:


N>>Файрволл? Уберите.

E>нет он здесь нипричем...

Я подозреваю, что вполне даже "причём" (на серверной стороне). Или же у вас на клиенте что-то относительно старое. Нормальная система без файрволла на коннект на незанятый никем порт тут же отдаст RST и будет облом connect() как только этот RST придёт. Старые винды (района 98 и ранней 2000, AFAIR) были известны тем, что игнорировали RST, потому что сами отдавали его в неуместных случаях (как переполнение слушающей очереди), но сейчас, мне казалось, это уже не актуально. Или актуально? Я бы советовал попробовать пообщаться с каким-нибудь вменяемым юниксом как сервером и посмотреть сниффером, что при этом происходит.

N>>Сказали connect(), получили WSAEINPROGRESS и теперь можете спокойно сами ждать сколько нужно и как нужно, проверяя через select() возможность записи.

E>нет, это я понимаю, но вот проблема в этом и состоит — функция не возвращает никаких значений втечение 20 секунд. Еще так не подумал использовать с неблокирующим сокетом, так что попробую

Я имел в виду как раз работу в неблокирующем режиме. Это в нём, если connect() не состоялся сразу (что возможно только на локальной машине) — возвращается [WSA]EINPROGRESS. В блокирующем, понятно, оно впадёт в ожидание, пока не сработает внутренний таймаут стека.

N>>Хотя под виндой часто удобнее воспользоваться асинхронным оповещением.

E>ну если я все правильно понял, то... мне это не совсем пойдет(по-моему придется слишком сильно перерабатывать код, а тем более если сработает ваше первое предложение, то обойдксь и им)

Тогда действительно включите неблокирующий режим и, если connect() отказался сработать сразу (а это основной вариант), через select() подождать сколько нужно. Ну и всё-таки посмотреть сниффером обмен пакетами.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.