ZLMediaKit / ZLToolKit

一个基于C++11的轻量级网络框架,基于线程池技术可以实现大并发网络IO
MIT License
1.88k stars 572 forks source link

test_tcpEchoServer.cpp例子中Buffer的使用是否正确? #233

Closed ss002012 closed 1 week ago

ss002012 commented 2 weeks ago

在该例子的onRecv函数如下,但是buf不应该被保留,而应该立刻使用,否则后面buf的数据发生变化就会对下面的send(buf)产生影响,而send(buf)是可能保留这个buf的,这样使用是不是有问题?

virtual void onRecv(const Buffer::Ptr &buf) override{
        //处理客户端发送过来的数据
        TraceL << buf->data() <<  " from port:" << get_local_port();
        send(buf);
}
xia-chu commented 1 week ago

是的 有bug buf是循环使用的 所以必须在本次函数调用时用完 不能缓存延后使用

xia-chu commented 1 week ago

不过现在可以把buf设置为空 底层能感知到 就会重新申请buffer,改成这样即可:

virtual void onRecv(const Buffer::Ptr &buf) override{
        //处理客户端发送过来的数据
        TraceL << buf->data() <<  " from port:" << get_local_port();
        send(buf);
       const_cast<Buffer::Ptr &>(buf).reset();
}
ss002012 commented 1 week ago

求指导下底层是如何感知的。我目前看到的是在attachEvent时获取的,只有这一次会判断是否为空,之后就都是使用获取的了,不知道哪个地方会再次判断呢? 1 2

CangJieStore commented 1 week ago

是的 有bug buf是循环使用的 所以必须在本次函数调用时用完 不能缓存延后使用

这个buf可以设置成不循环使用吗?

CangJieStore commented 1 week ago

buf每次接收前memset下0

ss002012 commented 1 week ago

buf每次接收前memset下0

我认为memset为0是没有用的 因为使用的是指针,大家都指向一块数据;感觉比较可靠的做法应该是新创建一个buffer并拷贝接受到的数据再进行处理。

xia-chu commented 1 week ago

求指导下底层是如何感知的。我目前看到的是在attachEvent时获取的,只有这一次会判断是否为空,之后就都是使用获取的了,不知道哪个地方会再次判断呢?

你更新下zltoolkit,这个感知特性是新加的

xia-chu commented 1 week ago

代码在这: image image

ss002012 commented 1 week ago

求指导下底层是如何感知的。我目前看到的是在attachEvent时获取的,只有这一次会判断是否为空,之后就都是使用获取的了,不知道哪个地方会再次判断呢?

你更新下zltoolkit,这个感知特性是新加的

多谢。