完成端口接受大数据的问题

littlebao 2008-12-17 11:48:49
客户端发送的数据(几十k)
服务器总是接受到8k左右。请问怎么才能够介绍完所有数据呢?
服务器接受流程大概为:
1.投递0字节的WSARecv
2.完成通知,利用recv接受数据
3.再次投递0字节的WSARecv

但是recv接受数据的数据都不会超过8k,为什么呢?
...全文
169 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
littlebao 2008-12-20
  • 打赏
  • 举报
回复
int nOptionValue,nOptionSize=sizeof(int);
//下面返回的nRcvBuffer是8192
getsockopt(m_hSocket,SOL_SOCKET,SO_RCVBUF,(char*)&nOptionValue,&nOptionSize);


INT nRcvBuffer=32*1024;

int nRetCode=setsockopt(m_hSocket,SOL_SOCKET,SO_RCVBUF,(const char*)&nRcvBuffer,sizeof(nRcvBuffer));

nOptionSize=sizeof(int);
//下面返回的nRcvBuffer是32768
getsockopt(m_hSocket,SOL_SOCKET,SO_RCVBUF,(char*)&nOptionValue,&nOptionSize);

说明设置成功了。但是recv接受到的数据仍然是8336
whatabig 2008-12-19
  • 打赏
  • 举报
回复

post intial recv:
WSARecv(lenhdr)

recv_loop:
GetOverlappedResult() or GetQueuedCompletionStatus()

validate_msg_header(ptrhdr) & get lenbdy

WSARecv(lenbdy)
insert_msg_into_queue(ptrbdy)

WSARecv(lenhdr)
僵哥 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 littlebao 的回复:]
引用 18 楼 unsigned 的回复:
引用 2 楼 littlebao 的回复:
但是接受完一次后(小于发送大小)就再也接受不到完成通知了。

通知返回之后有再次WSARecv么?如果没有,当然不会再通知,通知与请求之间是一对一的匹配关系。


因为一次接受完毕的数据量远远小于发送的数据量,所以再次WSARecv的话应该还会有通知才对的啊?
[/Quote]
是的,理论上是这样子,建议检查其它可能存在的错误。任何内存访问的违规都有可能导致不可预知的错误。
littlebao 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zzdmfk 的回复:]
与重叠IO模型配合。
[/Quote]

大哥,能否说详细点?
littlebao 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 unsigned 的回复:]
引用 2 楼 littlebao 的回复:
但是接受完一次后(小于发送大小)就再也接受不到完成通知了。

通知返回之后有再次WSARecv么?如果没有,当然不会再通知,通知与请求之间是一对一的匹配关系。
[/Quote]

因为一次接受完毕的数据量远远小于发送的数据量,所以再次WSARecv的话应该还会有通知才对的啊?
僵哥 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 littlebao 的回复:]
但是接受完一次后(小于发送大小)就再也接受不到完成通知了。
[/Quote]
通知返回之后有再次WSARecv么?如果没有,当然不会再通知,通知与请求之间是一对一的匹配关系。
qqlpp 2008-12-19
  • 打赏
  • 举报
回复
帮顶
路人乙2019 2008-12-19
  • 打赏
  • 举报
回复
与重叠IO模型配合。
sigh02 2008-12-19
  • 打赏
  • 举报
回复
如果你觉得8k这个数有什么特殊含义,可以setsockopt SO_RCVBUF更改缓冲区大小
看看是不是与缓冲区相关
或者直接缓冲设为0得了......
[Quote=引用 11 楼 littlebao 的回复:]
我怀疑是不是底层把剩余的数据丢弃了。
因为我测试了只要少于8k,接受数据都是正确的。

例如发送3k的数据用下面方式接受
1.投递0字节的WSARecv
2.完成通知,利用recv只接受1k数据
3.再次投递0字节的WSARecv
下次依然可以有完成通知,可以继续把剩余的2k接受完毕。

但是如果数据量超过8k的话
接受了一次(小于发送数据)就不会有完成通知了
[/Quote]
littlebao 2008-12-18
  • 打赏
  • 举报
回复
但是接受完一次后(小于发送大小)就再也接受不到完成通知了。
cnzdgs 2008-12-18
  • 打赏
  • 举报
回复
socket的接收缓冲区默认是8KB,剩下的数据下次再收。
dotnet90 2008-12-18
  • 打赏
  • 举报
回复
d
caitian6 2008-12-18
  • 打赏
  • 举报
回复
学习
sigh02 2008-12-18
  • 打赏
  • 举报
回复
不好意思,我看错了,你是总投递长度为0的WSARecv...
那就是用计算后的长度做第四次的recv
闪破风浪 2008-12-18
  • 打赏
  • 举报
回复
串口通讯带宽本来就有限,分批发送。。。。
sigh02 2008-12-18
  • 打赏
  • 举报
回复
第3次不应该投递0的WSARecv,应该计算还有多少没收,就WSARecv多少...
fandh 2008-12-18
  • 打赏
  • 举报
回复
只要分开发送,应该可以的呀!不知道你那儿没有做好!不行就贴代码!
yjgx007 2008-12-18
  • 打赏
  • 举报
回复
仔细检查代码.
blackcat242 2008-12-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 littlebao 的回复:]
但是接受完一次后(小于发送大小)就再也接受不到完成通知了。
[/Quote]
这个还有这种事情?代码贴出来看看
littlebao 2008-12-18
  • 打赏
  • 举报
回复
是为了降低未分页内存池的使用来提高系统总容量
加载更多回复(3)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧