请教socket中select()函数得使用方法。(50分)

  • 主题发起人 主题发起人 smallbee
  • 开始时间 开始时间
S

smallbee

Unregistered / Unconfirmed
GUEST, unregistred user!
[blue]谢谢各位,最好能给小弟一个例子加以说明。

不甚感激。[/blue]
 
select函数原型:
function select(nfds: Integer; readfds, writefds, exceptfds: PFDSet; timeout: PTimeVal): Longint;
参数说明:
nfds:在winsock中忽略
readfds: 检测是否可读的FDSet指针
writefds: 检测是否可写的FDSet指针
exceptfds: 检测是否可写的FDSet指针
timeout: 超时值。

例子:
procedure TServerClientThread.ClientExecute;
var
FDSet: TFDSet;
TimeVal: TTimeVal;
begin
while not Terminated and ClientSocket.Connected do
begin
FD_ZERO(FDSet);
FD_SET(ClientSocket.SocketHandle, FDSet);
TimeVal.tv_sec := 0;
TimeVal.tv_usec := 500;
if [red](select(0, @FDSet, nil, nil, @TimeVal) > 0)[/red] and not Terminated then
if ClientSocket.ReceiveBuf(FDSet, -1) = 0 then Break
else Synchronize(DoRead);
if (select(0, nil, @FDSet, nil, @TimeVal) > 0) and not Terminated then
Synchronize(DoWrite);
end;
end;

 
[:)]但是,你如何处理多个客户与服务器得连接啦?

客户得数量是不可确定得,按照你得程序例子,你怎么分别处理不同得客户连接?

不过你得答案给我很大得启事,谢谢。
 
例子里不是已经很清楚了吗?有没有仔细看啊?
 
大哥,俺不懂。^_^
 
FD_SET(ClientSocket.SocketHandle, FDSet);
这里不处理不同的客户端吗?(这是delphi的例子)
你要养成看vcl源码和帮助的习惯。
 
后退
顶部