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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ENet - disconnect спустя 30 секунд соединения. ENet - библиотека для UDP соединения. 
V
    Опции темы
KaraKum
  Дата 5.11.2010, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день.

Клиент подключается к серверу функциями библиотеки ENet. На клианте в консоли можно писать сообщения, которые будут передаваться серверу. Всё работает как надо, но только первые примерно 30 секунд - далее на сервере происходит DISCONNECT (выводится сообщение "Client information disconected." (см. код)) и больше сообщения от клиента не приходят. Однако на клиенте ничего не происходит - он "думает" что продолжает успешно отправлять сообщения.
В чём может быть дело?

Код сервера:
Код


#include <cstdio>

#include "enet\enet.h"

int main(int argc, int** argv)
{
    if (enet_initialize () != 0)
    {
        printf ("An error occurred while initializing ENet.\n");
        goto END;
    }
    
    /* Bind the server to the default localhost.     */
    /* A specific host address can be specified by   */
    /* enet_address_set_host (& address, "x.x.x.x"); */
    
    ENetAddress address;
    address.host = ENET_HOST_ANY;
    /* Bind the server to port 1234. */
    address.port = 1234;
    
    ENetHost* server = enet_host_create (
        & address /* the address to bind the server host to */,
        32      /* allow up to 32 clients and/or outgoing connections */,
        2      /* allow up to 2 channels to be used, 0 and 1 */,
        0      /* assume any amount of incoming bandwidth */,
        0      /* assume any amount of outgoing bandwidth */);

    if (server == NULL)
    {
        printf("An error occurred while trying to create an ENet client host.\n");
        goto END;
    }

    ENetEvent event;
WAIT_FOR_AN_EVENT:
    //int eventType    = enet_host_check_events(server, &event);
    enet_host_service(server, &event, 5);
    switch (event.type)
    {
    case ENET_EVENT_TYPE_CONNECT:
        printf ("A new client connected from %x:%u.\n", 
            event.peer -> address.host,
            event.peer -> address.port);
            
        /* Store any relevant client information here. */
        event.peer -> data = "Client information";
            
        break;
        
    case ENET_EVENT_TYPE_RECEIVE:
        printf ("A packet of length %u was received from %s on channel %u. Containings:\n    %s",
            event.packet -> dataLength,
            event.peer -> data,
            event.channelID,
            event.packet -> data);
            
        /* Clean up the packet now that we're done using it. */
        enet_packet_destroy (event.packet);
            
        break;
        
    case ENET_EVENT_TYPE_DISCONNECT:
        printf ("%s disconected.\n", event.peer -> data);
            
        /* Reset the peer's client information. */
        event.peer -> data = NULL;


        break;

    case ENET_EVENT_TYPE_NONE:
        break;
    }
    goto WAIT_FOR_AN_EVENT;

    printf("host halted.\n");

END:
    getchar();

    return 0;
}


Код клиента:
Код


#include <cstdio>

#include "enet\enet.h"

#include <vector>

int main(int argc, int** argv)
{
    //where reading console data will be stored:
    std::vector<char> buffer;

    if (enet_initialize () != 0)
    {
        printf ("An error occurred while initializing ENet.\n");
        goto END;
    }

    ENetHost* client    = enet_host_create (
            NULL /* create a client host */,
            1 /* only allow 1 outgoing connection */,
            2 /* allow up 2 channels to be used, 0 and 1 */,
            0/*57600 / 8*/ /* 56K modem with 56 Kbps downstream bandwidth */,
            0/*14400 / 8*/ /* 56K modem with 14 Kbps upstream bandwidth */);
    if(client == 0l)
    {
        printf("An error occurred while trying to create an ENet server host.\n");
        goto END;
    }

    ENetAddress address;
    /* Connect to localhost:1234. */
    enet_address_set_host(&address, "localhost");
    address.port    = 1234;

    /* Initiate the connection, allocating the two channels 0 and 1. */
    ENetPeer* peer    = enet_host_connect(client, &address, 2, 0);
    if(peer == 0l)
    {
        printf("No available peers for initiating an ENet connection.\n");
        goto END;
    }

    ENetEvent event;
    /* Wait up to 5 seconds for the connection attempt to succeed. */
    if (enet_host_service (client, & event, 5000) > 0 && event.type == ENET_EVENT_TYPE_CONNECT)
    {
        puts ("Connection to localhost:1234 succeeded.");
    }
    else
    {
        /* Either the 5 seconds are up or a disconnect event was */
        /* received. Reset the peer in the event the 5 seconds   */
        /* had run out without any significant event.            */
        enet_peer_reset (peer);
        
        puts ("Connection to localhost:1234 failed.");
        goto END;
    }

    printf("Input some data which will be sent to server...\n");

INPUT_DATA:
    buffer.clear();
    while(true)
    {
        char character = getchar();
        buffer.push_back(character);
        if(character == '\n')
        {
            break;
        }
    }
    buffer.push_back('\0');
    
    ENetPacket * packet = enet_packet_create(&buffer[0], buffer.size(), ENET_PACKET_FLAG_RELIABLE);

    enet_peer_send (peer, 0, packet);

    enet_host_flush(client);

    goto INPUT_DATA;


END:
    getchar();

    return 0;
}

PM MAIL WWW   Вверх
KaraKum
  Дата 5.11.2010, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Помогли решить вопрос на "ENet Mailing List".
Рассказываю для тех кто найдёт ветку в поисковике или ещё как-то:

Для того чтобы соединение не разрывалось необходимо постоянно на клиенте вызывать функцию "enet_host_service()". Третий параметр этой функции - толком не понятое время - в доках написано что это время, которое функция ждёт прежде чем вернуть "сообщений нет", однако, по уверениям документалистов, функция прерывается при появлении какого-либо события, но если, например, указать третий параметр как 1000 миллисекунд (как показано в примере руководства), то исходящие сообщения, в среднем, будут отправляться с задержкой в 500 миллисекунд ((0 + 1000) / 2). В моём примере основной поток занят функцией getchar(), поэтому я вызываю "enet_host_service()" в параллельном потоке:

Код

void* ENetHostService(void* client)
{
    ENetHost* castClient    = (ENetHost*)client;
    ENetEvent event;

ENET_HOST_SERVICE:
    enet_host_service(castClient, &event, 5);
    goto ENET_HOST_SERVICE;
}


Указал 5 миллисекунд, соответственно в среднем при отправке (не считая время прохождения пакета по кабелям и маршрутизаторам) имеется задержка в 2.5 миллисекунды. Если указать 0, то этот поток сожрёт 100% мощности процессора.

Это сообщение отредактировал(а) KaraKum - 5.11.2010, 19:42
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Сетевые технологии | Следующая тема »


 




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


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

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