背景:
1.服务器端向客户端发送大量数据包( 64K )
2.客户端一个线程recv接收数据,另外一个线程处理数据
问题:
1.客户端偶尔会出现10055错误,系统缓存已满
在不同的机器上会出现
2.客户端接收的数据不完整,比如一个包大小为64K,但有时只从系统缓冲读取出
<<< 64k ( 17K)作用,而且丢失包头,导致无法正确解析数据备注:服务端发送数据应该没有问题,无论是数据长度还是包内容我怀疑这2个错误是同一个原因导致
希望有经验的朋友给点建议
谢谢
1.服务器端向客户端发送大量数据包( 64K )
2.客户端一个线程recv接收数据,另外一个线程处理数据
问题:
1.客户端偶尔会出现10055错误,系统缓存已满
在不同的机器上会出现
2.客户端接收的数据不完整,比如一个包大小为64K,但有时只从系统缓冲读取出
<<< 64k ( 17K)作用,而且丢失包头,导致无法正确解析数据备注:服务端发送数据应该没有问题,无论是数据长度还是包内容我怀疑这2个错误是同一个原因导致
希望有经验的朋友给点建议
谢谢
解决方案 »
- 招聘“vc/c++软件工程师”,地点深圳
- 想找个人帮忙
- 求助:为什么读取进程的IAT表时没有发现ntdll.dll呢?
- 急求解决方法,关于非模态对话框!!!
- 寻VC++ 5.0的ID KEY!
- ----------------------------------- TabCtrl的麻烦问题 -------------------------------------
- 菜鸟文件操作问题。
- 微软的IE在浏览时打开多个窗口,这是多线程吗?怎么样使我自己的浏览器具有这种功能?
- 问一个CPropertySheet的事情
- SOS:VC++中有关图形打印的难题?
- 如何保证新添加的记录与表中原来的不重复?vc/ado/access
- 格式问题
你的情况好像就是你读的速度赶不上对方发送的速度, 你可以一次多读一些,比如10个包的大小,让处理函数去区分包。
tcp的缓冲默认大小是8k
<<< 64k ( 17K)作用,而且丢失包头,导致无法正确解析数据这个原因可能是什么原因导致的?
2.处理缓冲区
3.回到第一步
必须收一次包大小的数据,处理一次,再收。
缓存不够可能是没有delete 吧?
我测试过128K的包,也可以正常传输,但同样也会出现上述问题
不是设置系统缓冲的问题---------------------------------------------------------------
2.客户端接收的数据不完整,比如一个包大小为64K,但有时只从系统缓冲读取出
<<< 64k ( 17K)左右,而且丢失包头,导致无法正确解析数据怎么会出现这种情况呢?发送端肯定正确的
1、Use the socket in nonblocking or asynchronous mode.2、Break large-size data blocks into small ones and specify a relatively small buffer in send for blocking sockets, preferably no larger than 64K.3、Set the SO_SNDBUF socket option to 0 (zero) to allow the stack to send from your application buffer directly.建议楼主用2或者3试试,不过即使不返回错误,send也会堵塞,我想可能会影响你的业务,所以我觉得最好还是改善接收和发送的处理速度