linux socket i/o模型,基于Delphi的Socket I/O模型全接触

procedure TListenThread.Execute;

var

addr : TSockAddrIn;

fd_read : TFDSet;

timeout : TTimeVal;

ASock,

MainSock : TSocket;

len, i : Integer;

begin

MainSock := socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

addr.sin_family := AF_INET;

addr.sin_port := htons(5678);

addr.sin_addr.S_addr := htonl(INADDR_ANY);

bind( MainSock, @addr, sizeof(addr) );

listen( MainSock, 5 );

while (not Terminated) do

begin

FD_ZERO( fd_read );

FD_SET( MainSock, fd_read );

timeout.tv_sec := 0;

timeout.tv_usec := 500;

if select( 0, @fd_read, nil, nil, @timeout ) > 0 then //至少有1个等待Accept的connection

begin

if FD_ISSET( MainSock, fd_read ) then

begin

for i:=0 to fd_read.fd_count-1 do //注意,fd_count <= 64,也就是说select只能同时管理最多64个连接

begin

len := sizeof(addr);

ASock := accept( MainSock, addr, len );

if ASock <> INVALID_SOCKET then

....//为ASock创建一个新的线程,在新的线程中再不停地select

end;

end;

end;

end; //while (not self.Terminated)

shutdown( MainSock, SD_BOTH );

closesocket( MainSock );

end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值