关于TClientSocket通讯的问题,请高人赐教!
问题:
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




