社区
网络及通讯开发
帖子详情
SOCKET非阻塞式收发大块数据的困惑:数据块没有接收完
winapp
2003-04-24 04:57:58
我用TSERVERSOCKET采取非阻塞式发送大块的数据,发送之后立刻关闭当前套接字连接。
sendbuf(lp_BigBuf,n_Lenth);
Socket->Close();
在客户端也想采用非阻塞式接收数据,但接收的时候只收到一个数据块就收到了OnClose事件,数据没有收全啊!
请教各位我在非阻塞式的方式下该怎么办.
...全文
167
15
打赏
收藏
SOCKET非阻塞式收发大块数据的困惑:数据块没有接收完
我用TSERVERSOCKET采取非阻塞式发送大块的数据,发送之后立刻关闭当前套接字连接。 sendbuf(lp_BigBuf,n_Lenth); Socket->Close(); 在客户端也想采用非阻塞式接收数据,但接收的时候只收到一个数据块就收到了OnClose事件,数据没有收全啊! 请教各位我在非阻塞式的方式下该怎么办.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
superaf
2003-05-19
打赏
举报
回复
真不好意思,最近忙,好久没来了,我做过这种的。。
SharpKing515
2003-05-13
打赏
举报
回复
send是可以一次发出很多的,recv方就要进行处理,我建议你在recv后发送一个success这样的消息给send,send收到后在close
//------------------------------------------------------------------------
我觉得是在客户端发收完了以后然后发一个结束标志,当服务端收到该标志后断开。主动权因该在服务端吧?如果不是这样的话,客户端有时会出现关闭不了的情况。
winapp
2003-05-13
打赏
举报
回复
多谢几位!我懂了。
winapp
2003-05-13
打赏
举报
回复
对,很有道理!
可是有人知道SendBuf()和Socket->Close()具体做了些什么吗?
--------------------------------------------
SendBuf()到底做了什么啊?用了它只是表示要发送,要对方收到第一个包为标志?还是对方收完了才算发送完了?或者是过一会儿才发完,而不管对方接收到没有?
还有,我听说Socket->Close();并不是真的关闭了套接字,而是发送给对方一个信号,表示:我要关闭这个连接了,你接收完了就会关闭。到底是不是这样啊?
--------------------------------------------
netsys2
2003-05-13
打赏
举报
回复
SendBuf()到底做了什么啊?
----->VCL有源代码可以看,
检测网络是否连通,网卡是否空闲,系统网络服务是否空闲,然后发送给对方,
用了它只是表示要发送,要对方收完了才算发送完了吗?
“Socket->Close();并不是真的关闭了套接字,而是发送给对方一个信号,表示:我要关闭这个连接了,你接收完了就关闭。到底是不是这样啊?”
------》不是,是直接关闭连接。此时数据可能还未发完。TCP是保证数据传输的流协议,你关闭后对方就收不到剩下的数据了。
duduwolf
2003-05-13
打赏
举报
回复
send是可以一次发出很多的,recv方就要进行处理,我建议你在recv后发送一个success这样的消息给send,send收到后在close
winapp
2003-05-13
打赏
举报
回复
老大,我也觉得你说得太对了。
SendBuf()到底做了什么啊?用了它只是表示要发送,要对方收完了才算发送完了吗?
还有,我听说Socket->Close();并不是真的关闭了套接字,而是发送给对方一个信号,表示:我要关闭这个连接了,你接收完了就关闭。到底是不是这样啊?
netsys2
2003-05-13
打赏
举报
回复
你的问题在于:
数据还没发送完就拆线。通信建立与拆线优先级别高于数据传输!
设计通信系统时一定要注意,必须让接收端来拆线,确报数据接收完整。
发送端必须加时间判断,在一定的时间(如1分钟)对方未拆线在自己拆。
winapp
2003-05-13
打赏
举报
回复
出问题的时候我用
Socket->SendBuf(pBuf,iSize);
Socket->Close();
如果缓冲区太大,好像就可能出问题收不到。后来我在接收端(客户端)用阻塞式接收,发送端不关闭Socket了,让客户端收完了再自己关闭套接字,就不再出错了。有人解释系统说明一下相关问题吗?
pp616
2003-04-25
打赏
举报
回复
:)
你试试sendbuf(buf,1024*1000*1000);
看看能不能发^_^
既然发送端不是你写的。你知道知道对方发过来的数据格式。然后做对应的处理就好了啊。没那么复杂的啊。
winapp
2003-04-25
打赏
举报
回复
不好意思, pp616(傻小子)说的也是个不错的办法。
只是发送端是别人写的,我不好去找别人改写,所以只好为难自己了:(
winapp
2003-04-25
打赏
举报
回复
pp616(傻小子) 说得不对吧。
发送端
sendbuf(lp_BigBuf,n_Lenth);
//Socket->Close();
这样试了一下。结果发出去了啊,接收端反复接收,全部收完了20多个包!只是这样我就不知道该什么时候关闭这个套接字了。
采用你说发办法那我还不如一次发完,在接收端用阻塞式的方法接收,收到长度为0了就关闭套接字。
还有没有更好的想法各位老大?我就想都用非阻塞式的,比如想想该什么时候关闭当前套接字之类……
SharpKing515
2003-04-24
打赏
举报
回复
嗯,,楼上讲的没错!
pp616
2003-04-24
打赏
举报
回复
sendbuf对buf大小是有限制的。太大了根本发不出去的。
建议每次发8k以下的数据。然后多次发送。在接收端再组合数据。
想一次搞定是不可能的。
superaf
2003-04-24
打赏
举报
回复
在接受端,判断接受到的数据长度,不过还没有接受完,继续发请求给server端,
Linux环境下C语言
Socket
编程源码解析与实战
本文深入剖析基于C语言的Linux
Socket
服务器与客户端源码,涵盖套接字创建、连接管理、
数据
收发
、错误处理及多线程并发等关键环节。该源码项目为学习网络编程提供了宝贵的实践参考,帮助开发者掌握TCP/UDP通信原理,...
基于
Socket
的TCP服务器与客户端通信实战项目
内容涵盖
Socket
创建、连接管理、
数据
收发
、Win32 API调用、错误处理及多线程并发处理等关键技术,帮助开发者掌握TCP通信的基本流程与实际应用。项目适用于学习网络编程基础、理解TCP可靠性机制以及开发网络服务程序...
LG-Netty学习
Socket
,套接字就是两台主机之间逻辑连接的端点。TCP/IP协议是传输层协议,主要解决
数据
如何在网络中传输,而HTTP是...维度阻塞(Blocking)
非阻塞
(Non-Blocking)线程行为挂起等待操作
完
成立即返回,可执行其他任务。
ZMQ指南
我们
没有
能力将代码连接起来,也就不能像大脑中的神经元一样处理那些大规模的问题。 已经有人尝试用各种方法来连接应用程序,如数以千计的IETF规范,每种规范解决一个特定问题。对于开发人员来说,HTTP协议是比较...
从零造的一个网络轮子
1.CServiceNoBlock:是一个服务端的类,所有
socket
全都通过
非阻塞
模
式
进行accept、recv、send等行为,每次循环都会对所有
socket
进行操作,类似于轮询。 2.CServiceEpoll:继承自CServiceNoBlock,行为和...
网络及通讯开发
1,317
社区成员
8,874
社区内容
发帖
与我相关
我的任务
网络及通讯开发
C++ Builder 网络及通讯开发
复制链接
扫一扫
分享
社区描述
C++ Builder 网络及通讯开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章