关于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;为什么会这样?
...全文
626 21 打赏 收藏 转发到动态 举报
写回复
用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,为什么呢?
内容概要:SSD2828QN4是一款MIPI主桥接芯片,用于连接应用处理器与传统并行LCD接口及支持MIPI从属接口的LCD驱动器。该芯片支持最高每通道1Gbps的串行链路速度,最多可配置4个数据通道,显著减少了信号数量。它支持多种接口模式,包括RGB+SPI组合接口,适用于驱动智能或非智能显示面板,并能通过命令模式和视频模式传输数据。芯片内置时钟和复位模块、外部接口、协议控制单元(PCU)、包处理单元(PPU)、错误校正码/循环冗余校验(ECC/CRC)模块、长包和命令缓冲区、D-PHY控制器、模拟收发器以及内部锁相环(PLL),确保了高效的数据传输和系统稳定性。此外,文档详细描述了芯片的引脚分配、寄存器设置、操作模式、电源序列、时序特性等关键参数,为开发者提供了全面的技术指导。 适合人群:具备一定硬件设计基础,从事嵌入式系统开发、显示技术研究的研发人员。 使用场景及目标:①实现应用处理器与MIPI兼容显示屏之间的高速数据传输;②优化显示系统的功耗表现,减少电磁干扰(EMI);③通过灵活配置不同接口模式来适应各种显示设备的需求。 阅读建议:此文档面向具有一定电子工程背景的专业人士,建议读者结合实际项目需求深入理解各章节内容,特别是关于寄存器配置、时序要求等方面的具体说明。对于初次接触此类技术的开发者而言,建议先熟悉基本概念再逐步掌握高级功能的应用方法。

18,356

社区成员

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

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