阻塞的Client Socket 如何接收Server主动发出的消息(100分)

  • 主题发起人 主题发起人 makefile
  • 开始时间 开始时间
M

makefile

Unregistered / Unconfirmed
GUEST, unregistred user!
一个远程的Server 开启一个socket 在某端口监听,
客户端以同步方式连接到SocketServer上,
事务由客户端发起,并阻塞等待服务端的回复。

当客户端与服务端超过2分钟没有消息传送,则服务端开始进行网络连接检测,
socket Server向客户端发送检测消息,客户端接收到检测消息,给出回复,以确认
此连接链路是正常的。

用BCB(delphi)写的客户端使用TClientSocket.设置未ctBlocking方式。
通过TWinSocketStream 发送和接收数据,这样保证事务都是由客户端发起。
但是Server主动发起的网络检测消息,客户端能接收到吗? 怎么接收?
急!!
在线等待。
QQ:150485097
谢谢。



 
一样可以收到啊,在组塞下要受到,比如要调用waitfordata函数
Client部分可以不用组塞方式
 
to :张无忌
两端要同步操作,确定要用阻塞方式。
能不能说一下简单的实现?
 
即使是同步操作也没有必要非要用组塞,
用异步一样可以,就是你需要设置状态
不同的状态下执行不同的接受操作。
 
我知道非阻塞方式可以实现一问一答的同步方式。
但现在的情况是在已有的系统上,升级。
原来的实现方式是阻塞的。
现在要加入网络连接检测功能。
那么在原基础上,客户端该如何接收Server端主动发出的消息。
 
不知道你以前的流程,不好说啊
 
到帮助里面查找这个类
TWinSocketStream,
 
如果你在组塞下接受数据,一样可以用TClientSocket.ReceBuf什么的,只是如果没有
数据到来,他会塞住,所以先用WaitForData()。
 
流程比较简单。其他的都是数据检索和校验
//====================================
TWinSocketStream *aStream;
while ( HaveDataToSend)
{
aStream=new TWinSocketStream( aSocket,TIMEOUT)
try
{
aStream->Write(Buffer,sizeof(Buffer));//发送
Proc(aStream); //处理回复
}
__finally
{
delete aStream;
aStream=NULL;
}

}
//=====================================
以前都是主动的写,然后等待接收。

现在肯定要主动的去读,但不知道该如何实现。
 
调用TWinSocketStream.waitfor**函数,如果返回就说明有数据可以读了,
以前DFW里有很多这个方面的代码
 
TWinSocketStream::WaitforData()会造成其他的读写都被阻塞。
 
你既然是组塞式,就是一步一步下来的,一问一答类型的,读了数据再写出数据
既然这样,那你上面的意思我就不明白了
 
服务端会在连接空闲时每2分钟向客户端发送链路检测数据,用于探测该连接是否正常。
对于客户端就不知道什么时候去读来自于服务端的数据.

 
哦,那你用非组塞处理最好的,
 
完了。现在有回到原来的问题了。
我也知道是非阻塞方式接收最好了。
但是现在不可能重写系统。
烦啦。
 
我知道你的难处,其实组塞方式也一样写的,就是逻辑太复杂!
 
不知道你以前有没有尝试用WaitforData。
在等待数据的时候,程序就根本不响应外部事件。
 
你不会放到线程里去?[:D]
 
接受答案了.
 
后退
顶部