
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.198] |
![]() |
|
Сообщ.
#1
,
|
|
|
Всем добрый день!
Уже много дней бьюсь со следующей проблемой. Имеется tcp-клиент (С++, winsock). Он работает следующим образом: 1. connect 2. send - посылает немного (10-12 байт) данных 3. shutdown(SD_SEND) 4. while(recv() > 0) Подключаюсь к www.yandex.ru, передаю (в send) HTTP-запрос, он возвращает ответ. Все корректно. Стоит локальный Apache. Подключаюсь к нему через интерфейс сетевой карточки - 192.168.0.100 - ОК. Но вот стоит мне попробовать подключиться через loopback (127.X.X.X) - в 50% случает recv падает с ошибкой 10053. Причем: - в этом случае (в случае ошибки) recv возвращается мгновенно (по крайней мере зрительно задержки никакой нет). - если убрать вызов shutdown, то все работает корректно. Однако это решение не подходит, поскольку клиент изначально пишется не в качестве http клиента, и сервер должен иметь возможность определить, что данные больше передаваться не будут. Подозрение падает на loopback-петлю (и тогда это не имеет отношения к ветке форума), но я не знаю, как выяснить истинную причину падений, и заранее приношу извинения, если моя тема не попадает в рамки "С/С++ - сетевое программирование". Стоит Windows 7 Professional 32bit, Comodo firewall, Avira antivirus. Подозреваю, что фаейрвол и антивирус не виноваты: ни безопасный режим, ни их отключение проблем не решает. Сброс настроек TCP/IP тоже проблем не решает (netsh int ip reset). Эта же программа тестировалась на 3 реальных компьютерах с XP и Vista. Проблем не возникает. Работает исправно и на виртуальной машине с точно такой же Windows 7, как и на моем компьютере. Работает под Linux (там, конечно, используется не WinSock). 3 дня изучаю различные ресурсы интернета, видел еще 2-3 описания такой же ситуации на различных форумах, однако решения проблемы нигде не нашел. Переустановка Windows на основном компьютере, к сожалению, невозможна. Подскажите, пожалуйста, как можно выяснить причину возникновения 10053 ошибки? Заранее спасибо за любую помощь! |
Сообщ.
#2
,
|
|
|
Причин может быть много
WSAECONNABORTED (10053) Software caused connection abort. Berkeley description: A connection abort was caused internal to your host machine. The software caused a connection abort because there is no space on the socket's queue and the socket cannot receive further connections. WinSock description: Partly the same as Berkeley. The error can occur when the local network system aborts a connection. This would occur if WinSock aborts an established connection after data retransmission fails (receiver never acknowledges data sent on a datastream socket). TCP/IP scenario: A connection will timeout if the local system doesn't receive an (ACK)nowledgement for data sent. It would also timeout if a (FIN)ish TCP packet is not ACK'd (and even if the FIN is ACK'd, it will eventually timeout if a FIN is not returned). WinSock functions: recv(), recvfrom(), sendto(), FD_CLOSE Многие форумы говорят - что это обычно ошибка в коде Посмотрите вот здесь И еще одна подсказка. На локальной машине с 127.0.0.1 - часто нужны задержки, имитирующие задержку сети и задержку на время обработки на сервере - так как все общение идет практически моментально - через модуль IP - потому системный стек может давать сбои. |
Сообщ.
#3
,
|
|
|
Огромное спасибо!
В самом деле, помогла вставка задержки в 1мс между send и shutdown. Если бы не Ваша подсказка, думаю, еще не скоро бы я догадался до такого решения. |