18,356
社区成员
发帖
与我相关
我的任务
分享
int main(int argc, char* argv[])
{
GOOGLE_PROTOBUF_VERIFY_VERSION;
ProtoX::CProtoX oProtoX;
oProtoX.Init();
ProtoX::CServer oServer( oProtoX.GetEventBase(), ProtoX::SERVER_PORT );
int iResult = oProtoX.Run();
oProtoX.Uninit();
google::protobuf::ShutdownProtobufLibrary();
return iResult;
}
ProtoX::CServer::CServer( event_base* pBase, ev_uint16_t wProt ) :
m_pListener( NULL )
{
sockaddr_in oSockAddr = { 0 };
oSockAddr.sin_family = AF_INET;
oSockAddr.sin_port = INADDR_ANY;
oSockAddr.sin_port = htons( wProt );
m_pListener = evconnlistener_new_bind(
pBase,
OnNewConnection,
this,
LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE,
SOMAXCONN,
( const sockaddr* )&oSockAddr,
sizeof( oSockAddr ) );
PXASSERT( m_pListener );
evconnlistener_set_error_cb( m_pListener, OnListenerError );
}
服务器端是比较一般开启IOCP,监听端口。你那边有做过这个测试吗?如果你那边是好的,我可以对照一下
int main()
{
GOOGLE_PROTOBUF_VERIFY_VERSION;
ProtoX::CProtoX oProtoX;
oProtoX.Init();
std::vector< ProtoX::CChannel* > vctChannel;
const int NUM_CHANNEL = 1000;
for( int i = 0; i < NUM_CHANNEL; ++i )
{
ProtoX::CChannel* pChannel = new ProtoX::CChannel(
oProtoX.GetEventBase(),
"127.0.0.1",
ProtoX::SERVER_PORT );
PXASSERT( pChannel );
pChannel->SetDisconnectionCallback(
google::protobuf::NewPermanentCallback( OnDisconnection, &oProtoX ) );
pChannel->SetErrorCallback(
google::protobuf::NewPermanentCallback( OnError, &oProtoX ) );
vctChannel.push_back( pChannel );
ProtoX::EchoRequest oEchoRequest;
oEchoRequest.set_payload( "Hello Server" );
ProtoX::EchoService_Stub oEchoService( pChannel );
oEchoService.Echo( NULL, &oEchoRequest, NULL, NULL );
ProtoX::PtcC2SReq_ChatMessage oProtocol;
oProtocol.m_oReqChatMessage.set_type( ProtoX::ReqChatMessage::E_CHAT_TYPE_NEARBY );
oProtocol.m_oReqChatMessage.set_message( "I Send you a PtcC2SReq_ChatMessage" );
pChannel->SendProtocol( &oProtocol );
}
int iResult = oProtoX.Run();
for( int i = 0; i < NUM_CHANNEL; ++i )
{
delete vctChannel[ i ];
}
oProtoX.Uninit();
google::protobuf::ShutdownProtobufLibrary();
return iResult;
}
这是客户端的main函数,我把bufferevent封装成了CChannel,event_base封装到了CProtoX。通过编译宏MULTI_THREAD控制是否编译多线程版本(Windows平台下表明开启IOCP),当前我项目工程是添加了MULTI_THREAD的宏的。
创建1000个bufferevent,然后连接服务器,服务器也是开启IOCP的。