Приветствую.
Задался целью разобраться с 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);
}
}
Подскажите, пожалуйста, где и почему я не прав?