Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ ADC _ Поиск в протоколе ADC

Автор: Crecee 29.6.2012, 0:23

http://mydc.ru/topic2033s20.html

Цитата
На пассивный поиск каждый клиент в ответ может отсылать до пяти результатов, на активный - до десяти. При пассивном поиске команда отсылается клиенту через хаб, при активном - напрямую. Пассивность клиента определяется из параметра SU команды INF.


Возможные варианты режима пользователя, определяемого по INF:
1. Хаб режет SU в INF команде и режим пользователя не определен
2. Режим определен, пользователь может принимать только UDP пакеты
3. Режим определен, пользователь может принимать только TCP пакеты
4. Режим определен, пользователь может принимать и TCP и UDP пакеты

Возможные варианты поискового запроса:
1. Активный, рассылаемый всем
2. Пассивный, рассылаемый поддерживающим TCP или NATT

Согласно фразе:
Цитата
Пассивность клиента определяется из параметра SU команды INF.

которая мной не была найдена в официальной документации к протоколу, возникает неоднозначность в поведении клиентов.
Скажите пожалуйста, как поведет себя Strong и FlyLink в каждом из случаев:
1. - 1.
1. - 2.
2. - 1.
2. - 2.
3. - 1.
3. - 2.
4. - 1.
4. - 2.
Точнее сказать, как будет слать ответ, по TCP через хаб или напрямую по UDP?
Спасибо

Автор: Setuper 29.6.2012, 9:43

Видимо не совсем корректно написано.

Цитата
Пассивность клиента определяется из параметра SU команды INF

Наверное лучше было написать так: "Активность клиента определяется из параметра SU команды INF" или так: "Пассивность клиента определяется отсутствием в параметре SU команды INF характеристик активного клиента (TCP4, UDP4, TCP6, UDP6)".

Функции определения режима из исходного кода flylink
Код
bool Identity::isTcpActive(const Client* c) const
{
        if (c != NULL && user == ClientManager::getInstance()->getMe())
        {
                return c->isActive(); // userlist should display our real mode
        }
        else
        {
                return (!user->isSet(User::NMDC)) ?
                       !getIp().empty() && supports(AdcHub::TCP4_FEATURE) :
                       !user->isSet(User::PASSIVE);
        }
}

bool Identity::isUdpActive() const
{
        if (getIp().empty() || getUdpPort().empty())
                return false;
        return (!user->isSet(User::NMDC)) ? supports(AdcHub::UDP4_FEATURE) : !user->isSet(User::PASSIVE);
}

bool Identity::supports(const string& name) const
{
        string su = get("SU");
        StringTokenizer<string> st(su, ',');
        for (StringIterC i = st.getTokens().cbegin(); i != st.getTokens().cend(); ++i)
        {
                if (*i == name)
                        return true;
        }
        return false;
}


http://mydc.ru/r/?http://code.google.com/p/flylinkdc/source/browse/trunk/client/User.cpp

Автор: Crecee 29.6.2012, 15:51

Не понятно поведение клиента при получении поискового запроса и необходимости отвечать на него, так сказать в "экзотических случаях".
Не могли бы вы написать для каждой комбинации как флайлинк будет слать ответ, по TCP через хаб, или по UDP напрямую


Возможные варианты режима пользователя, определяемого по INF, на поисковый запрос которого необходимо ответить:
1. Хаб режет SU в INF команде и режим пользователя не определен
2. Пользователя, от которого пришел поисковый запрос, вообще нет на хабе и соответственно его режим не определен
3. Режим определен, пользователь может принимать только UDP пакеты
4. Режим определен, пользователь может принимать только TCP пакеты
5. Режим определен, пользователь может принимать и TCP и UDP пакеты

Возможные варианты поискового запроса:
1. Активный, рассылаемый всем
2. Пассивный, рассылаемый поддерживающим TCP или NATT

Всего 10 комбинаций:
1. - 1.
1. - 2.
2. - 1.
2. - 2.
3. - 1.
3. - 2.
4. - 1.
4. - 2.
5. - 1.
5. - 2.
Подпишите их пожалуйста, как поведет себя в таких случаях флайлинк

Автор: Crecee 4.7.2012, 0:14

Я так понимаю согласно протоколу поведение DC клиентов в таких случаях не определено?