关于tcp非阻塞发送

zjz800800 2012-06-01 02:44:31
关于非阻塞发送请教一下大家:

平台是windows xp
1.我测试了一下系统的接收和发送缓冲都是8192
2.我使用select下的tcp非阻塞发送
3.按照一些文章中的介绍,当发送数据大于缓冲(自己和对方)的话数据会阻塞在底层(有好几种情况,暂不叙述)

现在问题是:

比如我发送56M数据,第一次send时,返回值尽然也是56M

例:res = send(g_fd_ArrayC[nLoopi],pBuff,1024 * 1024 *56,0);

res返回值不是-1,是1024 * 1024 *56;为什么会这样?
...全文
571 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjz800800 2012-06-26
  • 打赏
  • 举报
回复
测试的结果1024 * 1024 *56是正确的,问题已经解决,对大家回答不满意,不过感谢大家,给分先。
zdcju 2012-06-21
  • 打赏
  • 举报
回复
再说TCP是基于数据流的 不是像UDP那样基于数据包的
所以对TCP来说 你设置 1024 * 1024 *56 还是 1024 没区别
是TCP和底层协议 为你去计算每次发送 多大的数据 所以计算的结果肯定不是 1024 * 1024 *56。。。。。
zdcju 2012-06-21
  • 打赏
  • 举报
回复
感觉还是不太可能 1024 * 1024 *56 返回值 除非你是本地回来才有可能这个结果

应该是 发送的时候 1024 * 1024 *56 大的数据
应该是分成若干次 recv 加起来等于1024 * 1024 *56 才对
avcodec-decoder 2012-06-21
  • 打赏
  • 举报
回复
强烈建议阅读TCP\ip协议,发送的时候,即使你发出去了,tcp/ip会将大的数据包分成小的片段,到达目的地后在组装起来,所以发送的数据会返回真实的大小,接受也会返回真实接受的数据大小
zjz800800 2012-06-21
  • 打赏
  • 举报
回复
大家回答不满意,我怎么结贴啊,不过既然大家来了,分总是要给的,再放几天结贴
zjz800800 2012-06-13
  • 打赏
  • 举报
回复
没有人知道怎么回事情吗?大牛们,快来
success_happy_one 2012-06-07
  • 打赏
  • 举报
回复
我也正在研究这个问题 大家多多讨论呀
zjz800800 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 1 楼 的回复:

补充一下,发送的时候,接收方不接收的时候返回也是1024 * 1024 *56,而不是-1,为什么呢?

你在本地回路上测试的? 你用两台计算机测试 应该就不是这个结果了。。。。。。
[/Quote]


你好,我本地和局域网内两台机器都测过了,1024 * 1024 *56是成功的,但如果这个成功的话分配这么大的空间是谁给的,tcp协议栈吗?如果一个进程这么起上10个socket这么发送那岂不是数据量很大,另外成功应该就是阻塞在底层了,因为接收端不接收
Eleven 2012-06-04
  • 打赏
  • 举报
回复
协议会分~
ouyh12345 2012-06-04
  • 打赏
  • 举报
回复
localhost?
本机回路不经过网卡的
zdcju 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

补充一下,发送的时候,接收方不接收的时候返回也是1024 * 1024 *56,而不是-1,为什么呢?
[/Quote]
你在本地回路上测试的? 你用两台计算机测试 应该就不是这个结果了。。。。。。
zdcju 2012-06-04
  • 打赏
  • 举报
回复
下面的协议会帮你分析处理分包的。。。。。。。。。再说本来TCP就是基于流的 再大再小都是以数据流去对待 这和UDP不一样
zdcju 2012-06-04
  • 打赏
  • 举报
回复
太大了会分包 但分包发送又不是TCP层的功能 TCP只负责把数据交给传输层 应该是只要交了就成功了 具体怎么分包TCP一点都管不着 是下面协议的事
glovel0425 2012-06-04
  • 打赏
  • 举报
回复
错误返回-1,按照你说的 3.这个情况,返回的也不应该是-1吧。 而且是不是这些数据已经发出去了,至于会不会阻塞在底层,socket根本就不管,因为这些数据已经发送成功了。返回的就是实际发送的长度。仅供参考……
百事烟 2012-06-04
  • 打赏
  • 举报
回复
谁是管理员啊

该回复于2012-06-04 16:05:09被管理员删除
zjz800800 2012-06-04
  • 打赏
  • 举报
回复
我确实测试是这样的结果,第一次send 会成功,对端不接收,测试的时候最大到100M而128M中间的某个中间值才会返回-1,否则返回是发送的数据的大小,不知原因。
zdcju 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
你好,我本地和局域网内两台机器都测过了,1024 * 1024 *56是成功的,但如果这个成功的话分配这么大的空间是谁给的,tcp……
[/Quote]
如果你是两台机子测试 不可能返回1024 * 1024 *56。。。。。。。。。
应该是分多次接受才能接收的玩 你send 1024 * 1024 *56 底层会自动给你分包发送的
wyx100 2012-06-04
  • 打赏
  • 举报
回复
回复于:2012-06-04 10:17:50localhost?
本机回路不经过网卡的

zjz800800 2012-06-01
  • 打赏
  • 举报
回复
补充一下,发送的时候,接收方不接收的时候返回也是1024 * 1024 *56,而不是-1,为什么呢?

18,363

社区成员

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

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