解决方案 »
- 请教关于按钮特效的问题
- 获取键盘输入对应的窗口
- 如何得到WINDOWS系统配置信息,包括系统版本是否为XP,SP2补丁是否打上,USB版本是否为2.0,显卡是否支持DirectX9.0
- CTreeView类与ClistView类的显示问题,望高手赐教!
- 请各位高手推荐基本关于vc 的数据库编程的书
- 我的困惑,你的选择--稳定的工作或是编程
- 哈希表的实列??
- 请问类型CLongBinary怎样转换为类型CByteArray?
- float型数据如何倒序写文件
- 如何在VC中实现:在列表框(CLISTBOX)中同时显示*.A和*.b的文件?
- 怎样捕获Combo Box收起
- 关于DirectX游戏中鼠标指针的问题...
2. Post一个Buffer为0的WSARecv,然后等待完成通知,接着调用recv做事,将系统缓冲区的数据copy过来.对比2种:WSARecv 中指定的缓冲区就会被锁定到系统的非分页内存池以等待数据, WSARecv 返回 WSA_IO_PENDING. 如果网络上有数据来了, 这些数据将会被直接保存到我们提供的缓冲区中.
如果一个服务器同时连接了许多客户端, 对每个客户端又调用了许多 WSARecv, 那么大量的内存将会被锁定到非分页内存池. 锁定这些内存时是按照页面边界来锁定的, 也就是说即使你 WSARecv 的缓存大小是 1 字节, 被锁定的内存也将会是 4k. 非分页内存池是由整个系统共用的, 如果用完的话最坏的情况就是系统崩溃. 一个解决办法是, 使用大小为 0 的缓冲区调用 WSARecv. 等到调用成功时再换用非阻塞的 recv 接收到来的数据, 直到它返回 WSAEWOULDBLOCK 表明数据已经全部读完. 在这个过程中没有任何内存需要被锁定, 但坏处是效率稍低.