这个问题让我纠结了一天,看了不少资料没找到合适的答案。
问题是收到的数据会发生所谓的粘包现象!包的大小不确定,可以很大,最大可以用满投递的读缓存的大小,4K,这个有上限吗?该如何怎样去拆包:网上说需要用到环形缓冲区或者双缓冲区,他们的原理很好理解,但是我想如果客户端很多,每个连接(考虑连接数可能有1W)都配一个或者两个缓冲区拼接数据(这里应该不用考虑包的顺序会乱?因为我的协议包用的是起始和结束标志),这样是不是要开另外一个内存池?!另外,必须每次先把收的数据拷贝到这些缓冲区,但是据说拷贝数据也会带来不少的开销!
因为投递读操作的缓冲区是在一个内存池之中,而环形缓冲区或者双缓冲区的大小也比较大,这样一来,内存的使用很可观啊,虽然内存很便宜。还是说有其他方案吗?假设使用环形缓冲区,需要把拆包的过程放到另外的一个或者多个线程吗?这个线程只是遍历所有的环形缓冲区做拆包工作,然后把拆出来逻辑包扔到另外一个队列,交由其他的一个或多个线程解包?
问题先到这里吧!刚接触服务器开发,感觉开发服务器水很深!希望经验丰富的各位指点一二,不胜感激。TCP/IPiocp服务器内存
问题是收到的数据会发生所谓的粘包现象!包的大小不确定,可以很大,最大可以用满投递的读缓存的大小,4K,这个有上限吗?该如何怎样去拆包:网上说需要用到环形缓冲区或者双缓冲区,他们的原理很好理解,但是我想如果客户端很多,每个连接(考虑连接数可能有1W)都配一个或者两个缓冲区拼接数据(这里应该不用考虑包的顺序会乱?因为我的协议包用的是起始和结束标志),这样是不是要开另外一个内存池?!另外,必须每次先把收的数据拷贝到这些缓冲区,但是据说拷贝数据也会带来不少的开销!
因为投递读操作的缓冲区是在一个内存池之中,而环形缓冲区或者双缓冲区的大小也比较大,这样一来,内存的使用很可观啊,虽然内存很便宜。还是说有其他方案吗?假设使用环形缓冲区,需要把拆包的过程放到另外的一个或者多个线程吗?这个线程只是遍历所有的环形缓冲区做拆包工作,然后把拆出来逻辑包扔到另外一个队列,交由其他的一个或多个线程解包?
问题先到这里吧!刚接触服务器开发,感觉开发服务器水很深!希望经验丰富的各位指点一二,不胜感激。TCP/IPiocp服务器内存
解决方案 »
- 匿名管道通信为何只能读写交替啊,连续从管道中读取数据有问题,马上卡死
- accept 和 AcceptEx 的问题?
- 如何在单文档里使用RichEdit控件读取xml文件并显示出来?
- RichEdit的怪问题,复制,粘贴??????请大家帮助
- 如何为CRichEdit添加横向滚动条?
- 请进来看一看
- 非常简单的问题,在MDI工程中怎样阻止默认文档的建立?
- getwindowrect(&rect)然后在其上dc.draw(icon)为什么画出来的icon这么大?
- 怎么写打印代码?急!急!急!
- 求援:哪位仁兄可能提供在工作线程里不停地读取UDP数据报的一小段源码,谢谢!
- 关于StretchDIBits 函数的问题?
- 关于MFC中滚动条的问题
server开发很容易.
高强度,不崩溃,无bug的server很难.
实际怎么解包要看你的协议,我的只是参考。http://blog.csdn.net/yang79tao/article/details/7724514
svn checkout http://st-asio-wrapper.googlecode.com/svn/trunk/ st-asio-wrapper-read-only
长度 + 数据 + 长度 + 数据 的形式来发送, 这样就可以在服务器先读取长度, 再拿出对应长度的缓冲, 直到缓冲满了就可以处理, 然后再读取下一次的 长度, 再解释出数据, 如此循环而已.