问题如下,请给出简单明了的代码,谢谢。1)在IdTCPServer的OnConnect里如何主动中断连接?(5分)2)在IdTCPServer的OnException里如何主动中断连接?(8分)3)在IdTCPServer的有包进来如何通知程序?(17)--就像Socket的WSAAsyncSelect模型和WSAEventSelect模型
问题如下,请给出简单明了的代码,谢谢。1)在IdTCPServer的OnConnect里如何主动中断连接?(5分)2)在IdTCPServer的OnException里如何主动中断连接?(8分)3)在IdTCPServer的有包进来如何通知程序?(17)--就像Socket的WSAAsyncSelect模型和WSAEventSelect模型
2、connection.disconnect;
3、OnExcute事件里处理
>>你不使用IdTCPServer,而采用WSAAsyncSelect/WSAEventSelect或者支持WSAAsyncSelect/WSAEventSelect的控件不就好了
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
cmd,i:integer;
str:string;
begin
cmd:=AThread.Connection.ReadInteger;
if cmd=1 then
begin
str:=AThread.Connection.ReadLn;
exit;
end;
if cmd=2 then
begin
i:=AThread.Connection.ReadInteger;
exit;
end;
end;
在delphi中indy的中文资料算是比较多的,如果用其它控件,或许容易解决WSAAsyncSelect/WSAEventSelect的问题,但可能要问多好几个其他问题。
现在目的只想在IdTCPServer有包进来的时候才使用Readbuf等处理包,因为在onException中用Readbuf是阻塞的。
type
TCmd=Record
cmd:integer;
param:integer;
end;procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
cmd:TCmd;
i:integer;
str:string;
begin
AThread.Connection.ReadBuffer(cmd,sizeof(cmd));
if cmd.cmd=1 then
begin
str:=AThread.Connection.ReadLn;
exit;
end;
if cmd.cmd=2 then
begin
i:=AThread.Connection.ReadInteger;
exit;
end;
end;
AThread.Connection.ReadBuffer(cmd,sizeof(cmd)); //如果没包进来,运行到这应该发生堵塞
在onException中不希望出现堵塞,就是有包进来才使用ReadBuffer等处理包,就像Socket的WSAAsyncSelect模型和WSAEventSelect模型。