libevent на freeBSD
От: Максим Беларусь  
Дата: 13.02.08 08:26
Оценка:
Приветствую.
Задался целью разобраться с libevent-ом, т.е. написать кроссплатформенное клиент-серверное приложение на его основе. С Win и Linux (Debian) проблем не возникло, а вот госпожа "фряха" нервов уже попортила. Повсеместно нахожу собщения, дескать С++ код будет одинаков для Линуха, фряхи и вин.

Следующий код работает под вин и линух, но под фрибсд упорно на OnError получаю ошибку EVBUFFER_EOF, что расцениваю, как успешное отцепление клиента.
//создаю эвент для сокета
//pSocket->hSocket - хендл "входящего" сокета
    pSocket->pBufEvent = bufferevent_new(pSocket->hSocket, OnRead, NULL, OnError, (void*)pSocket);
    if(!pSocket->pBufEvent)
    {
        pSocket->Disconnect(true);
        return false;
    }

    if(bufferevent_base_set(m_base, pSocket->pBufEvent) == -1)
    {
        Disconnect(true);
        return false;
    }

    #ifdef WIN32
    bufferevent_settimeout(pSocket->pBufEvent, 0, 10000, 0, 0); //for "select" 10 ms
    #endif
    if(bufferevent_enable(pSocket->pBufEvent, EV_READ|EV_PERSIST) == -1)
    {
        pSocket->Disconnect(true);
        return false;
    }
/////////////////////////////////////////////////////

//обрабатываю ошибки
void OnError(PBUFFEREVENT pBufEvent, short what, void* pParam)
{
    if(!pParam)
        return;

    Socket* pSocket = (Socket*)pParam;
    if(!pSocket->IsConnected())
        return;

    if (what & EVBUFFER_READ)
    {
        if(what& EVBUFFER_TIMEOUT)
        {
        }
        if(what & EVBUFFER_EOF)
        {
            //Closed by remote side
            sLog.outBasic("<Socket %u> Closed by remote side.", pSocket->GetSocket());
            pSocket->Disconnect();
            return;
        }
        if(what & EVBUFFER_ERROR)
        {
            sLog.outError("<Socket %u> Unknown error while reading.", pSocket->GetSocket());
            pSocket->Disconnect(true);
            return;
        }
    }
    else if (what & EVBUFFER_WRITE)
    {
        if(what & (EVBUFFER_ERROR|EVBUFFER_TIMEOUT|EVBUFFER_EOF))
        {
            sLog.outError("<Socket %u> Unknown error [%u] while writing.", pSocket->GetSocket(), what);                                                 pSocket->Disconnect(true);
            return;
        }
    }
    else
    {
        sLog.outError("<Socket %u> Unknown error [%u] while unknown operation :( .", pSocket->GetSocket(), what); pSocket->Disconnect(true);
    }
}


Подскажите, пожалуйста, где и почему я не прав?
Re: libevent на freeBSD
От: Максим Беларусь  
Дата: 13.02.08 08:30
Оценка:
Здравствуйте, Максим, Вы писали:

М>но под фрибсд упорно на OnError получаю ошибку EVBUFFER_EOF

Эту ошибку я получаю сразу же после запуска event_loop-а.
Re: libevent на freeBSD
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 19.02.08 22:31
Оценка:
Здравствуйте, Максим, Вы писали:

М>Приветствую.

М>Задался целью разобраться с libevent-ом, т.е. написать кроссплатформенное клиент-серверное приложение на его основе. С Win и Linux (Debian) проблем не возникло, а вот госпожа "фряха" нервов уже попортила. Повсеместно нахожу собщения, дескать С++ код будет одинаков для Линуха, фряхи и вин.

Отвечу не по сути, но я несколько раз пытался что-то осмысленное написать с помощью libevent и обламывался — логика этой библиотеки, похоже, совсем не для средних умов. ISC eventlib куда проще, понятнее и работоспособнее. Вот с ней — успешно строил. И глупых глюков и нечеловеческой логики с ней — нет.
The God is real, unless declared integer.
Re[2]: libevent на freeBSD
От: Michael Chelnokov Украина  
Дата: 20.02.08 12:08
Оценка:
Здравствуйте, netch80, Вы писали:

N>Отвечу не по сути, но я несколько раз пытался что-то осмысленное написать с помощью libevent и обламывался — логика этой библиотеки, похоже, совсем не для средних умов. ISC eventlib куда проще, понятнее и работоспособнее. Вот с ней — успешно строил. И глупых глюков и нечеловеческой логики с ней — нет.


Видимо, для полного счастья ей не хватает быть отдельным продуктом...
Re[3]: libevent на freeBSD
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 20.02.08 12:16
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Здравствуйте, netch80, Вы писали:


N>>Отвечу не по сути, но я несколько раз пытался что-то осмысленное написать с помощью libevent и обламывался — логика этой библиотеки, похоже, совсем не для средних умов. ISC eventlib куда проще, понятнее и работоспособнее. Вот с ней — успешно строил. И глупых глюков и нечеловеческой логики с ней — нет.


MC>Видимо, для полного счастья ей не хватает быть отдельным продуктом...


На фре — `portinstall libisc'
The God is real, unless declared integer.
Re[4]: libevent на freeBSD
От: Michael Chelnokov Украина  
Дата: 20.02.08 15:04
Оценка:
Здравствуйте, netch80, Вы писали:

N>На фре — `portinstall libisc'


Убедил
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.