使用LibEvent发送数据的最佳方式

时间:2014-03-12 22:50:46

标签: c++ multithreading sockets libevent

我有一个使用lib事件的多线程C ++应用程序。接收全部发生在libevent进程中,然后设置一个标志,以便稍后处理接收的数据。在发送时,事情出错了。我在一个“主线程”中,汇编了要发送的数据,然后调用了以下函数。

int SocketWrapper :: SendData( const U8* buffer, int length )
{
  if( m_useLibeventToSend )
  {
     bufferevent*   bev = GetBufferEvent();
     struct evbuffer* outputBuffer = bufferevent_get_output( bev );
     evbuffer_lock( outputBuffer );

     int result = evbuffer_add( outputBuffer, buffer, length );

     evbuffer_unlock( outputBuffer );
     return result;
  }

  return send( m_socketId, (const char* )buffer, length, 0 );
}

这个函数有时会在evbuffer_add调用时崩溃,但99.9%的时候它工作正常。这闻起来像一个并发错误,它可能与客户崩溃或即将到来有关。我确保在libevent初始创建套接字期间,我做了以下事情:

struct evbuffer* outputBuffer = bufferevent_get_output( GetBufferEvent() );
evbuffer_enable_locking( outputBuffer, NULL );

你有什么其他特殊初始化我应该做的概念吗?我不应该从我的主线程调用“SendData”而是将事件发送到bufferevent,以便发送应该在与libevent相同的过程中发生吗?

所有设计理念都是开放的。到目前为止,我的解决方法是不使用libevent来发送,而是直接写入套接字。

这种崩溃发生在发布和调试,VS 2008,libevent 2.0中。它在图书馆的深处,所以我将尝试在我的项目中包含c文件来尝试追踪我的问题,但也许有人在这里知道什么是错的。 : - )

0 个答案:

没有答案