谁能给讲讲indy的阻塞模式是怎样的,关于它有个问题不明白。 (50分)

  • 主题发起人 主题发起人 homejun
  • 开始时间 开始时间
H

homejun

Unregistered / Unconfirmed
GUEST, unregistred user!
在indy中我想用 idtcpserve给客户端发信息,在如下场景下能正常吗?
客户端发一个命令请求取数据并等待读取,在服务器还未(或正在)进行处理时服务器端人工给客户端发一个信息,那客户端在读取数据缓存时会不会出错?所谓的阻塞会保证读取的数据正确吗?
 
用阻塞模式有很多好处,只是程序就会陷入令人难以容忍的停止响应的状态,所以
使用indy一般结合线程使用,我本人为公司开发了多套软件的下载更新机制都是
基于indy的,甚至还开发了服务器程序,只是indy的开发服务器软件有一些限制
同时处理的连接数不能太大,否则效率很低,如果你要开发web服务器之类的服务器
还是自己用socket写,比如用完成端口模型等
你说的情况是不会出错的 能保证数据读取的正确
 
呵呵,现在改一个程序,有如下问题,idtcpserve服务器要求除可以C/S方式发信息,也可以直接发信息给客户端,客户端用线程读缓存处理,有个问题解决不了:
信息格式是自定义的且定长(超过255个字节),
type
TmsgBlock = record
command:string[10];
Msg:array[0..300] of char;
end;

IdTCPClient1.ReadBuffer(msgblock, sizeof(msgblock));//读取缓存数据
虽然客户端可以正常读取处理,但发现如果服务器发送一个长度小于或大于
sizeof(msgblock)的信息时,客户端处理出错。虽在程序中可以避免,但这样
感觉很不安全,如果有人用程序发送一条信息客户端就挂了。有没有什么方法
可以提前核验一下信息的长度等信息呀?
 
用协议啊,你可以使用协议头,满足协议头的报文才接收
 
怎样用协议头呀,一读数据就已经出错了,麻烦给个简单例子。
 
发送数据的时候前面带上协议头,
协议头你可以自己定义,比如定义为类型、长度、校验码的记录;
客户端处理的时侯先看看协议头对不对,如果不对,显然不是你的程序发出的;
别人如果要使你的客户端响应,必须知道你的协议才可以,这种几率就比较小了;
几率取决于你的校验码。
example:
type
TmsgBlock = record
Type:char;
Len:integer;
VerifyCode:word;
command:string[10];
Msg:array[0..300] of char;
end;
读取你可以用ReadStream(AStream: TStream,-1);然后进行分析
 
后退
顶部