ACE pipe open иногда возвращает ошибку 10060 - «Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом» - PullRequest
0 голосов
/ 04 июня 2018

Следующий вызов:

ACE_HANDLE handles[2];
ACE_Pipe pipe;
if (pipe.open(handles)==-1)
    T_OS_ELOG(ACE_OS::last_error());

Иногда приводит к ошибке, и ACE_OS :: last_error возвращает следующую строку:

Error code: 10060. Error details: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 

Я нахожу это запутанным, так как строка ошибки иво всех связанных с этим документах / ответах упоминается, что удаленная сторона / узел не отвечает, но в моем случае я только пытаюсь открыть канал и на самом деле у меня еще нет узла.

Это не брандмауэрсвязанная с этим проблема (нет брандмауэра и еще ничего не выходит наружу), и я уверен, что это не потому, что у меня закончились порты или что-то в этом роде, потому что в этом случае я получаю "Only one usage of each socket address (protocol/network address/port) is normally permitted".

Так, что могло вызвать эту ошибку?

(кстати, я работаю на Windows)

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Отвечая на вопросы будущих искателей: как упоминал Стив Хьюстон, ACE_Pipe реализован с использованием петлевого сокета TCP на окнах.

Петлевой протокол TCP получает довольно низкий приоритет в планировщике окна, поэтому, когда система слишком занята, открывается петлясоединения могут произвольно прерваться по таймауту, если ожидается слишком много задач с более высоким приоритетом.

Необязательным решением будет использование сокетов быстрого пути (https://blogs.technet.microsoft.com/wincat/2012/12/05/fast-tcp-loopback-performance-and-low-latency-with-windows-server-2012-tcp-loopback-fast-path/) или полное удаление сокетов и вместо этого использование анонимных каналов (https://docs.microsoft.com/en-us/windows/desktop/ipc/anonymous-pipes).

Несомненно, что обе опции не поддерживаются ACE, поэтому для этого потребуется реализовать собственный IPC вместо использования ACE_Pipe. Также он не кроссплатформенный.

0 голосов
/ 05 июня 2018

Я не знаю, что является основной причиной ошибки, но в Windows ACE_Pipe реализован с использованием петлевого TCP-сокета.Вот как концепция удаленного пира / вечеринки попадает в картину.Я рекомендую пройти через него с помощью отладчика и посмотреть, какой из вызовов не будет выполнен.

...