Comments (4)
发送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.
发送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
是甲方要求的我没法改动,想要解读出X
和Y
。目前在收到string_view
数据后转换为string
再进行处理。
std::string recvdata{data};
from asio2.
string_view 已经有了数据内容和数据长度,完全没有必要转换为string再去处理。
string是怎么处理的,string_view用同样的方法一样的处理,这个转换完全是无意义的。
这个转换,收到数据后,该怎么转换,就怎么转换就行。
目前在收到string_view数据后转换为string再进行处理。 -- 这说明你不是已经可以转换了吗。再优化下,不要转成string,而是直接用string_view 处理即可。
去B站搜索一下tcp粘包的教程,看一下再说吧,你问的都是基础问题。
from asio2.
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 ,从而得到 1
和 2
。我感觉这和粘包无关。
from asio2.
Related Issues (20)
- http server支持大文件上传和下载吗 HOT 7
- qt 和vs2017下编译异常 HOT 4
- 在平板上发送消息延迟严重 HOT 9
- execution_work_guard没有重载函数可以转换所有参数类型(asio新版本) HOT 1
- http client使用ip请求报错 HOT 4
- 3rd目录建议手动git引入 HOT 2
- http服务手动应答的问题 HOT 3
- 能否提供ws服务首次应答后的通知或回调或手动应答
- 能否提供MQTT的SSL链接方式支持 HOT 1
- 在linux下与Qt库中一个宏变量名产生冲突 HOT 1
- http_server 启动失败时获取到的error_msg还是Success HOT 1
- http 请求拦截器before获取不到url HOT 10
- 支持http2吗 HOT 1
- 请问如何加快编译时间 HOT 1
- 多线程ICMP HOT 1
- Encoding and line break problems caused by `asio2::last_error_msg().c_str()` on windows HOT 2
- 请问下现在库里面有对http跨域请求的支持选项吗 HOT 1
- http_client multipart HOT 1
- Clion 24.1 debug模式编译 tcp_client_general.cpp提示file too big HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from asio2.