GithubHelp home page GithubHelp logo

Comments (4)

zhllxt avatar zhllxt commented on June 2, 2024

发送i-1:2,server接收异常,显示收到 i-1:21111,但长度为5

这说明什么问题?这说明接收的数据长度和数据内容都是正确的。

那为什么打印出来的看上去却不正确?因为打印日志的语句有问题。问题在哪里呢?

把你的打印数据的语句从printf("data %zu %s\n", data.size(), data.data());改为printf("data : %zu %.*s\n", data.size(), (int)data.size(), data.data());即可。

原因是什么?

网络接收数据,必须要有一个缓冲区,假如这个缓冲区是10M,第一次收到的数据是9M,那么缓冲区前面的9M都会被填充成接收到的数据,如果第二次只收到1个字节,那么在收到这1个字节以后,我们需要把10M的缓冲区中其它的1010241024-1=10485760-1=10485759这么多字节都要清0吗?

需要吗?有必要吗? -- 完全没有。这是几乎完全无意义的操作,浪费CPU,降低效率。

所以原因就是在每次接收数据后,缓冲区中的,后面的,以前的数据,没有清0,此时只需要打印日志时注意数据长度即可。

其实bind_recv里已经给你传的数据格式就是std::string_view data了,你只需要std::cout<<data<<std::endl;即可。不用上面那个printf的奇怪的格式了,你也不容易理解 。

你后面的问题我没看。

from asio2.

sirlis avatar sirlis commented on June 2, 2024

发送i-1:2,server接收异常,显示收到 i-1:21111,但长度为5

这说明什么问题?这说明接收的数据长度和数据内容都是正确的。

那为什么打印出来的看上去却不正确?因为打印日志的语句有问题。问题在哪里呢?

把你的打印数据的语句从printf("data %zu %s\n", data.size(), data.data());改为printf("data : %zu %.*s\n", data.size(), (int)data.size(), data.data());即可。

原因是什么?

网络接收数据,必须要有一个缓冲区,假如这个缓冲区是10M,第一次收到的数据是9M,那么缓冲区前面的9M都会被填充成接收到的数据,如果第二次只收到1个字节,那么在收到这1个字节以后,我们需要把10M的缓冲区中其它的10_1024_1024-1=10485760-1=10485759这么多字节都要清0吗?

需要吗?有必要吗? -- 完全没有。这是几乎完全无意义的操作,浪费CPU,降低效率。

所以原因就是在每次接收数据后,缓冲区中的,后面的,以前的数据,没有清0,此时只需要打印日志时注意数据长度即可。

其实bind_recv里已经给你传的数据格式就是std::string_view data了,你只需要std::cout<<data<<std::endl;即可。不用上面那个printf的奇怪的格式了,你也不容易理解 。

你后面的问题我没看。

感谢解答。

如果需要按照特定格式解出收到的信息,应该如何操作呢?比如数据格式i-X:Y是甲方要求的我没法改动,想要解读出XY。目前在收到string_view数据后转换为string再进行处理。

std::string recvdata{data};

from asio2.

zhllxt avatar zhllxt commented on June 2, 2024

string_view 已经有了数据内容和数据长度,完全没有必要转换为string再去处理。
string是怎么处理的,string_view用同样的方法一样的处理,这个转换完全是无意义的。
这个转换,收到数据后,该怎么转换,就怎么转换就行。
目前在收到string_view数据后转换为string再进行处理。 -- 这说明你不是已经可以转换了吗。再优化下,不要转成string,而是直接用string_view 处理即可。
去B站搜索一下tcp粘包的教程,看一下再说吧,你问的都是基础问题。

from asio2.

sirlis avatar sirlis commented on June 2, 2024

string_view 已经有了数据内容和数据长度,完全没有必要转换为string再去处理。 string是怎么处理的,string_view用同样的方法一样的处理,这个转换完全是无意义的。 这个转换,收到数据后,该怎么转换,就怎么转换就行。 目前在收到string_view数据后转换为string再进行处理。 -- 这说明你不是已经可以转换了吗。再优化下,不要转成string,而是直接用string_view 处理即可。 去B站搜索一下tcp粘包的教程,看一下再说吧,你问的都是基础问题。

收到,感谢。可能是我没有找到合适的方法把 string_view 按照收到的实际长度进行预处理。对于发送 1:2 但收到的缓存字符串为 1:21111 的情况,用 data.substr(0, data.size()); 然后对 : 进行切分没有得到预期结果。所以我才把 string_view 转为 string ,他会自动根据长度来得到实际的字符串而不是整个 buffer ,从而得到 12。我感觉这和粘包无关。

from asio2.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.