redfox1999

Results 14 comments of redfox1999

#include #include .... google::InitGoogleLogging(argv[0]); //google::SetLogDestination(google::GLOG_INFO, "log"); google::SetStderrLogging(google::GLOG_WARNING);

创建 多个 TcpServer 或 http:Service 。然后用同一个 EventLoop 就可以了。 so easy。 只是有点不太好的地方, http::Service 不是多线程的。httpServer 又不能用 EventLoop.

``` evpp::TCPServer server(&loop, "0.0.0.0:8088", "server1", 4); server.Init(); server.SetConnectionCallback(ClientConnectionCallback); server.SetMessageCallback(ClientMessageCallback); server.Start(); evpp::TCPServer server2(&loop, "0.0.0.0:8089", "server2", 4); server2.Init(); server2.SetConnectionCallback(ClientConnectionCallback); server2.SetMessageCallback(ClientMessageCallback); server2.Start(); evpp::http::Service http_server(&loop); http_server.RegisterDefaultHandler(HttpRequestCallback); http_server.Listen(8000); evpp::http::Server http_server2(4); http_server2.RegisterDefaultHandler(HttpRequestCallback); http_server2.Init("8080,9000"); http_server2.Start(); loop.Run(); ```

you need TcpConn onWriteCompleteCallback to send large data by block . to look: https://github.com/Qihoo360/evpp/pull/178

还是用中文回复你吧。不是很确定我看懂了你的问题。你想问的是怎么用 TcpConn 发送一个巨大的 buffer。 我的建议是永远不要这样做。而是应该在应用协议层,分块的方式发送。

tcp 是流式的。肯定会有分包或粘包的问题,需要用户自己定义协议,两边用协议解析。 协议定义是用户层的,网络层不会做这个。

> > tcp 是流式的。肯定会有分包或粘包的问题,需要用户自己定义协议,两边用协议解析。 > > 协议定义是用户层的,网络层不会做这个。 > > 顺带 问一句,除了这个是用户层的原因之外,封装成 send once recv once 的模式,有什么坏处或者说不好的地方吗, 因为我觉得这个封装应该是一个很普遍的需求.... 因为做不到。

> > > > tcp 是流式的。肯定会有分包或粘包的问题,需要用户自己定义协议,两边用协议解析。 > > > > 协议定义是用户层的,网络层不会做这个。 > > > > > > > > > 顺带 问一句,除了这个是用户层的原因之外,封装成 send once recv once 的模式,有什么坏处或者说不好的地方吗, 因为我觉得这个封装应该是一个很普遍的需求.... > >...

evpp 可以很方便实现这个功能。onMessage 时,先从 buffer 里peek 一个 int32 出来看下,如果小于 buffer->length() 说明这个包收完了。如果大于 buffer->length() 什么也不用管。它会帮你把没处理的数据保存起来,下次再处理

大多数协议都不是这样