CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  网络及通讯开发

关于TClientSocket通讯的问题,请高人赐教!

楼主dengjieshenhai(深海)2006-05-01 11:35:59 在 C++ Builder / 网络及通讯开发 提问

问题:  
  1、用TClientSocket和服务器建立连接后,不仅要发送数据还要接受数据,我应该怎么处理才好,是写两个线程,一个用来接收数据,一个用来发送数据呢,还是应该怎么搞。  
  2、因为服务端程序是别人做的,我应该怎么判断有没有数据过来,是一直不停ReceiveBuf呢还是通过别的方法。  
   
  以上2个问题谢谢赐教! 问题点数:100、回复次数:15Top

1 楼pp616(坏蛋)回复于 2006-05-01 20:20:25 得分 20

连接后如果收到数据会出发OnRead事件。  
  在那里面处理就可以了。  
  发送用  
  ClientSocket1->Socket->SendBuf  
  ClientSocket1->Socket->SendStream  
  ClientSocket1->Socket->SendText  
  都可以Top

2 楼xpdavis(咕嘟-不想孤独)回复于 2006-05-01 21:23:09 得分 0

五一了还这么忙啊,辛苦了  
   
  楼上说的基本可以解决你所提的问题。  
   
  至于是否需要采用线程,还是要看你的系统性能优化方面的考虑吧。Top

3 楼dengjieshenhai(深海)回复于 2006-05-02 00:47:59 得分 0

Non-blocking   sockets   do   not   always   receive   an   OnRead   event   for   the   last   bit   of   data   passed   over   the   connection.   When   using   a   non-blocking   socket,   check   for   any   unread   data   in   the   OnDisconnect   event   to   make   sure   that   everything   is   handled.  
   
  以上是ClientSocket的OnRead事件的帮助说明,要想OnRead事件有效必须ClientSocket的ClientType属性是ctBlocking。而我设置的是ctNonBlocking,所以请问OnRead事件会触发吗?Top

4 楼xpdavis(咕嘟-不想孤独)回复于 2006-05-02 05:45:53 得分 20

楼主这么晚还没休息,真是辛苦啊。  
   
  这个帮助的意思并不是说,如果把socket设置为非阻塞,就不能触发OnRead事件,相反是可以的。问题在于在TCP连接的最后阶段(即断开连接的时候)有可能不会触发这个事件,所以它建议你在OnDisconnect事件中检查是否还有数据没有处理完。Top

5 楼dengjieshenhai(深海)回复于 2006-05-02 10:35:29 得分 0

非常感谢楼上弟兄们的帮助,大家都一样辛苦,放假了还在CSDN上泡,还有个问题想请教一下:楼上的兄弟xpdavis(咕嘟)   说建议在OnDisconnect事件中检查是否还有数据没有处理完,应该怎么检查。还有就是通讯的双方的通讯模式是不是必须一样,也就是要么都是ctNonBlocking,要么都是ctBlocking方式的?Top

6 楼zyyoung(倡导开源)回复于 2006-05-02 14:39:31 得分 0

友情upTop

7 楼dengjieshenhai(深海)回复于 2006-05-02 19:10:29 得分 0

只有自己再顶了!Top

8 楼xpdavis(咕嘟-不想孤独)回复于 2006-05-02 19:16:27 得分 30

不好意思,今天有事情出去了,没能及时回帖。  
   
  按照帮助上所说的情形来看,应该是在OnDisconnect事件中检查ReceiveLength是否大于0,这个仅仅是猜测,因为本人并没有做过这方面的尝试。楼主可以一试。  
   
  至于楼主的第二个问题,回答是否定的,因为怎么接收数据那是通信双方各自的事情,对方无法也没必要约束。当然从规范角度来说,最好双方的接收方式一致的,这个跟风格问题有点类似吧,可能我的比喻不太恰当。Top

9 楼xpdavis(咕嘟-不想孤独)回复于 2006-05-02 19:17:05 得分 0

哈哈,原来楼主在线,嘿嘿  
   
  偶刚从外面回来呢Top

10 楼dengjieshenhai(深海)回复于 2006-05-03 09:47:27 得分 0

这2天只是在考虑这个问题,一直没有时间去试一下,今天终于有时间了,把大家说的方法都试一下,如果还有问题的话还是要麻烦大家多多指教啊!Top

11 楼dengjieshenhai(深海)回复于 2006-05-03 10:07:41 得分 0

还是有问题啊,为什么我的OnRead事件中收不到数据呢?Top

12 楼dengjieshenhai(深海)回复于 2006-05-03 10:24:20 得分 0

实在是搞不明白,为什么ClientSocket的OnRead事件不能触发!Top

13 楼soloxiao(红色孤独)回复于 2006-05-10 22:15:40 得分 30

在线程中不要用ClientSocket的OnRead事件,直接改成阻塞式创建一个TWinSocketStream  
  while   (!Terminated   &&   ClientSocket->Connected)  
  {  
  if   (pStream   !=   NULL){  
  delete   pStream;  
  }  
  pStream   =   new   TWinSocketStream(ClientSocket,   TimeOut);  
   
  if   (pStream->WaitForData(60000))  
  {  
  recvlen   =   pStream->Read(recv_buf,   1024);  
  }  
  }Top

14 楼Yans(跟贴是一种友谊)回复于 2006-07-28 21:53:43 得分 0

关注...Top

15 楼YJS050320001(Thinking)回复于 2006-07-29 10:32:23 得分 0

跟帖是一种友谊  
  关注....Top

相关问题

关键词

得分解答快速导航

  • 帖主:dengjieshenhai
  • pp616
  • xpdavis
  • xpdavis
  • soloxiao

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo