SOCKET非阻塞式收发大块数据的困惑:数据块没有接收完

winapp 2003-04-24 04:57:58
我用TSERVERSOCKET采取非阻塞式发送大块的数据,发送之后立刻关闭当前套接字连接。
sendbuf(lp_BigBuf,n_Lenth);
Socket->Close();
在客户端也想采用非阻塞式接收数据,但接收的时候只收到一个数据块就收到了OnClose事件,数据没有收全啊!
请教各位我在非阻塞式的方式下该怎么办.
...全文
167 15 打赏 收藏 转发到动态 举报
写回复
用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端,

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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