tcp的recv问题!

sharkhuang 2003-12-08 10:11:48
当recv的时候,比如一次收500字节!而且不知道什么时候这个数据结束。所以要while()一直收!如果不知道结束,最后一次recv将阻塞。
现在有什么办法可以知道recv结束了!
除了:send端关掉socket以外还有什么办法?让recv能返回!
...全文
381 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaokc2000 2003-12-13
  • 打赏
  • 举报
回复
对不起,我不会。
sharkhuang 2003-12-13
  • 打赏
  • 举报
回复
timer 怎么加?
孙亖 2003-12-10
  • 打赏
  • 举报
回复
回复人: sharkhuang(爱情和程序都读不懂) ( ) 信誉:100 2003-12-10 10:24:00 得分:0
楼上的结护符的话,那不是我读的东西每次都要判断?效率?
-----------------------------------------------------------
效率要自己想办法,不然还自己写程序干什么,不如买个控件。
sharkhuang 2003-12-10
  • 打赏
  • 举报
回复
楼上的结护符的话,那不是我读的东西每次都要判断?效率?
wujingang1979 2003-12-10
  • 打赏
  • 举报
回复
你加以加一个timer嘛。让它龟儿子自已去处理。要不就加个线程。
wujingang1979 2003-12-10
  • 打赏
  • 举报
回复
板主:华为的程控程序就是这么搞的,值得借鉴。这种方法很稳妥。要正确性又要效率,两种不可奸时,这确实是好办法。
suntao222 2003-12-09
  • 打赏
  • 举报
回复
do{

if((retval=recv(msg_socket,Buffer,sizeof(Buffer),0))<0)
{
EditPrintf (hwndEdit, TEXT ("receive data error.\r\n")) ;
return TRUE;
}
}while(retval!=0);
seilfer2000 2003-12-09
  • 打赏
  • 举报
回复
有些程序员可能会在r e c v中使用M S G _ P E E K标志,或者调用i o c t l s o c k e t (设置F I O N R E A D选项),
在系统的缓冲区中,事先“偷看”是否存在足够的字节数量。然而,在不实际读入数据的前
提下,仅仅“偷看”数据(如实际读入数据,便会将其从系统缓冲区中将其删除),可不是一
件光彩的事情。我们认为,这是一种非常不好的编程习惯,应尽全力避免。在“偷看”的时
候,对系统造成的开销是极大的,因为仅仅为了检查有多少个字节可用,便发出一个或者更
多的系统调用。以后,理所当然地,还需要牵涉到进行实际r e c v调用,将数据从系统缓冲区
内删除的开销。那么,如何避免这一情况呢?在此,我们的目标是防止由于数据的缺乏(这
可能是网络出了故障,也可能是客户机出了问题),造成应用程序完全陷于“凝固”状态,同
时不必连续性地检视系统网络缓冲!为达此目的,一个办法是将应用程序划分为一个读线程,
以及一个计算线程。两个线程都共享同一个数据缓冲区。
wujingang1979 2003-12-09
  • 打赏
  • 举报
回复
愚人觉得最好的办法是加开始字符和结束字符。接收端收到信息后如果没有结束字符就一直返给发送端一个未收消息让它再发。直到接收端收到结束字符就发一个消息给发送端告诉它不必再发。
roscoe 2003-12-09
  • 打赏
  • 举报
回复
我一般是在 OnRecv中只读一次,因为OnRecv事件只要在没收到FD_CLOSE前,只要RECV缓冲区中有数据,系统就会不停发送FD_READ.一直到收到FD_CLOSE为止.
在OnClose做 do while 循环.读出在FD_CLOSE之后收到的数据.
sharkhuang 2003-12-09
  • 打赏
  • 举报
回复
怎么异步?select以后还是不知道收多少数据!
堕落骑士1980 2003-12-09
  • 打赏
  • 举报
回复
用SELECT就能解决,你可以自己在把数据封装一下,例如定义个1024大小的,接收的时候都用1024大小接收,或者用外接字。
sharkhuang 2003-12-09
  • 打赏
  • 举报
回复
楼上的写什么?buff多大?是不确定的!
sharkhuang 2003-12-08
  • 打赏
  • 举报
回复
没问题!回答哦
pzoon 2003-12-08
  • 打赏
  • 举报
回复
帮你UP给我1分就好
lostgdi731 2003-12-08
  • 打赏
  • 举报
回复
用CSocket 的 OnReceive事件函数,当有系统缓冲有数据就会被调用。
ydfok 2003-12-08
  • 打赏
  • 举报
回复
异步不就可以吗?
sharkhuang 2003-12-08
  • 打赏
  • 举报
回复
我现在就是这个办法!
madhappy 2003-12-08
  • 打赏
  • 举报
回复
自定协议啊.发送端把数据打包在结尾或者开头做特定字符

然后接收端识别字符.再把字府剥离开来.就这样.
seilfer2000 2003-12-08
  • 打赏
  • 举报
回复
消息长度不同,处理也可能不同。因此,有必要利用你自己的协议来通知接收端,即将
到来的消息长度是多少。比方说,写入接收端的前4个字节一直是整数,表示即将到来的消息
有多少字节。然后,接收端先查看前4个字节的方式,把它们转换成一个整数,然后判断构成
消息的字节数是多少,通过这种方式,便开始逐次读取。
加载更多回复(2)

18,356

社区成员

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

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