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);
    }
}


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