我没有分了,但是这个问题很急,请大家帮忙!!(0分)

  • 主题发起人 主题发起人 fxh7622
  • 开始时间 开始时间
F

fxh7622

Unregistered / Unconfirmed
GUEST, unregistred user!
我设置一个网络接受端的接受模式为阻塞模式,可是我不知道在函数select中设置的最后一个参数应该设置成什么?那位能告诉我呢???
 
这里的人是不是只看分的???
 
我也不知道你想做什么,查了一下我手中的资料也没有,你可以去搜索一下的.
我搜到的结果:
熟悉WINSOCK编程的读者一定会觉得奇怪吧,为什么INDY是是完全基于SOCKET阻塞工作模式的呢?异步模式(非阻塞模式)是WINSOCK的一大特点,为什么不用呢?
  其实,之所以大多数WINDOWS下的INTERNET程序都使用异步模式,这和WINSOCK的历史有关。当WINSOCK被移植到WINDOWS的时候,当时的WINDOWS操作系统还是WINDOWS 3.1,而WINDOWS 3.1是不支持多线程的,不象UNIX下可以使用FORK来运行多进程。在WINDOWS 3.1下,如果使用阻塞模式,在通讯时会锁定用户界面使程序没有响应,为了避免这种情况,WINSOCK就引入异步模式这个新特性。而使用异步模式来编制INTERNET程序也就成了WINDOWS程序员的经典教条。但是,随着新的WINDOWS操作系统的出现,如WINDOWS 95、NT、98、ME、2000等,这些操作系统开始支持多线程。异步模式这个教条仍然深入人心,使很多程序员会下意识的拒绝使用阻塞模式。
  事实上,UNIX下的SOCKET只支持阻塞模式(现在UNXI的SOCKET有了一些新的非阻塞特性,不过绝大多数应用仍然使用阻塞模式)。阻塞模式具有以下几个比异步模式优越的特点:
  编程更简单,可以把所有处理SOCKET的代码放在一起,顺序执行,而不用分散在不同的事件处理代码段里。
  更容易移植到UNIX,使用INDY的DELPHI程序,可以不做太多(甚至不做)修改,就可以把WINDOWS的DELPHI源代码拿到LINUX下,用Kylix来编译成LINUX下的网络程序。
更容易在多线程程序里使用,由于阻塞模式的代码可以放在一起,可以很方便的把这些代码包裹在线程里面来使用,而不象异步模式,需要针对不同的事件,设置不同的处理代码。
  为了兼顾简单可靠和高效,INDY是基于阻塞模式工作的。阻塞模式需要等待任务完成才返回,这样,当主线程里调用阻塞任务运行时,程序不能处理用户界面的消息。INDY提供了一个控件TidAntiFreeze来解决这个问题。只要在你的程序里,简单的填加一个TidAntiFreeze控件到任何地方(随便往FORM上放),不需要写任何代码(最多把超时时间改一下),就可以很好的解决用户界面不响应的问题。
  下面有两段示范代码,可以看出INDY控件的程序代码和其他使用异步模式的Internet控件的程序代码相比,是多么的简洁:
代码一:INDY控件的程序代码(IndyClient代表INDY控件的一般形式)
with IndyClient do begin
Connect;
Try
// 在这里写入你的处理代码
finally
Disconnect;
end;
end;
代码二:其他控件的程序代码(SocketComponent代表一般的Internet控件)
procedure TFormMain.TestOnClick(Sender: TComponent);
begin
with SocketComponent do begin
Connect; try
while not Connected do begin
if IsError then begin
Abort;
end;
Application.ProcessMessages;
OutData := 'Data To send';
while length(OutData) > 0 do begin
Application.ProcessMessages;
end;
finally Disconnect; end;
end;
end;
procedure TFormMain.OnConnectError;
begin
IsError := True;
end;
procedure TFormMain.OnRead;
var
i: Integer;
begin
i := SocketComponent.Send(OutData);
OutData := Copy(OutData, i + 1, MaxInt);
end;
 

Similar threads

后退
顶部