Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определить, что передача по UDP завершена 
:(
    Опции темы
Aoizora
Дата 11.2.2017, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.11.2016

Репутация: нет
Всего: нет



Я пишу функцию для приложения, которая должна выполнять следующие задачи:

1. Соединиться с каждым из hardcoded клиентом p2p-сети
2. Послать ему запрос списка пиров, хранящегося в его локальной таблице
3. Принять пакеты, в поле данных каждого из которых находится информация о ноде
4. То же самое сделать со следующим элементом списка hardcoded серверов или вернуть управление из функции

У меня пока что такой код:

Код

#define arr_sz(a) (sizeof(a) / sizeof(a[0]))

static client_node bootstrap_list[] = 
{
    { 16777343, 39426, 0}    // ip = 127.0.0.1, port = 666, time = 0
};

void bootstrap(SOCKET sock)
{
    char packet[PACKET_SIZE] = { 0 };
    size_t list_size = arr_sz(bootstrap_list);

    for (size_t node_idx = 0; node_idx < list_size; ++node_idx)
    {
        pull_peer_list(sock, &bootstrap_list[node_idx]);
        while (recvfrom(sock, packet, PACKET_SIZE, 0, NULL, NULL) > 0)
        {
            // Process packet
        }
    }
}


Цикл по всем нодам, к каждой ноде выполняется запрос. Мне нужно как-то отсюда выйти, когда сервер перестанет посылать данные по UDP (или перейти к другому элементу списка). Как это сделать
PM MAIL   Вверх
tzirechnoy
Дата 11.2.2017, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



По таймаутам.

Ну, ещё можно в сервере указать, когда последний пакет послан. Но по таймаутам -- абсолютно обязательно.
PM MAIL   Вверх
Aoizora
Дата 12.2.2017, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.11.2016

Репутация: нет
Всего: нет



Цитата(tzirechnoy @ 11.2.2017,  23:41)
По таймаутам.

Ну, ещё можно в сервере указать, когда последний пакет послан. Но по таймаутам -- абсолютно обязательно.

По таймаутам - это вот так?

Код

static int recvfrom_timeout(SOCKET sock, long sec, long usec)
{
    struct timeval timeout;
    timeout.tv_sec = sec;
    timeout.tv_usec = usec;

    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(sock, &fds);

    return select(0, &fds, 0, 0, &timeout);
}

void bootstrap(SOCKET sock)
{
    char packet[PACKET_SIZE] = { 0 };
    size_t list_size = arr_sz(bootstrap_list);

    for (size_t node_idx = 0; node_idx < list_size; ++node_idx)
    {
        pull_peer_list(sock, &bootstrap_list[node_idx]);
        while (recvfrom_timeout(sock, 10, 0) > 0)
        {
            recvfrom(sock, packet, PACKET_SIZE, 0, NULL, NULL);
            client_node peer;
            get_data(packet, &peer);
            printf("recvd peer\n");
            show_node_data(&peer);
        }
    }
}

PM MAIL   Вверх
_zorn_
Дата 15.2.2017, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Что то типа этого делаешь ?  smile 
https://aminux.wordpress.com/2017/01/12/gov...rents-download/

А по поводу кода - да, без селекта ВООБЩЕ НИКАК. Так по ублюдочному сделан стек в винде. 
recv будет висеть ВЕЧНО... Я тоже споткнулся об это. Ну по логике - нет данных, верни что прочитал (0,1 или 0.5 на крайняк smile) и отпусти ты дальше прогу выполняться, так нет же - до сих пор селект надо, даже если тебе пофиг или сам разрулишь если получил/принял меньше чем присылалось/отправлялось.
Причем такое даунское поведение именно тогда когда recv буфер пуст.
PM MAIL   Вверх
feodorv
Дата 17.2.2017, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Цитата(_zorn_ @  15.2.2017,  16:39 Найти цитируемый пост)
Так по ублюдочному сделан стек в винде. 
recv будет висеть ВЕЧНО... Я тоже споткнулся об это. Ну по логике - нет данных, верни что прочитал (0,1 или 0.5 на крайняк smile) и отпусти ты дальше прогу выполняться

Прежде чем так возмущаться перевести сокет в асинхронный режим не пробовали?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Олег2005
Дата 12.3.2017, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Или использовать IOCP?
На худой конец WSAEventSelect?
PM MAIL WWW MSN   Вверх
_zorn_
Дата 15.3.2017, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Цитата(feodorv @  17.2.2017,  12:27 Найти цитируемый пост)

Прежде чем так возмущаться перевести сокет в асинхронный режим не пробовали? 

Так мне не нужен асинхронный. От колбеков и в яваскрипте тошнит. Хочу получить данные, обработать и дальше наслаждаться солнцем smile 
Уточню - наслаждение солнцем зависит от полученных данных.
PM MAIL   Вверх
feodorv
Дата 16.3.2017, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 10
Всего: 45



Честно говоря, я не знаю, что там в JavaScript с асинхронными сокетами - колбек или нет, да и причем он тут, если речь идёт о C/C++. Сокет можно перевести в асинхронный режим через FIONBIO, а затем пользовать read безо всяких колбеков. Но речь-то идёт об этой фразе:
Цитата(_zorn_ @  15.2.2017,  16:39 Найти цитируемый пост)
Так по ублюдочному сделан стек в винде. recv будет висеть ВЕЧНО...
Стек TCP/IP сделан так почти везде, и везде будет висеть recv() на блокирующем сокете, ожидая прихода данных. Я намекаю на то, что не стек виноват.



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1280 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.