基于Delphi的SocketIO模型全接触

基于Delphi的SocketIO模型全接触,第1张

基于Delphi的SocketIO模型全接触,第2张

这与套接字模型非常相似。我以老陈的收信为例来说明Socket I/O模型。

1.选择型号

陈渴望看到女儿的来信。他每10分钟下楼检查一次邮箱,看看是否有他女儿的来信。这种情况下,“下楼查看邮箱”再上楼,耽误了陈先生太多时间,其他工作都做不了。

选择模型与陈老师的这种情况非常相似:反复检查...如果有数据...接收/发送它。.......

使用线程进行选择应该是一种常见的做法:

过程TListenThread。执行;
var
addr:TSockAddrIn;
FD _ read:tfd set;
time out:ttime val;
ASock,
main stock:t socket;
len,I:Integer;
begin
main stock:= socket(AF _ INET,SOCK_STREAM,IP proto _ TCP);
addr . sin _ family:= AF _ INET;
addr . sin _ port:= htons(5678);
addr.sin_addr。s _ addr:= htonl(in addr _ ANY);
bind(main stock,@addr,sizeof(addr));
听(MainSock,5);

while(未终止)do
begin
FD _ ZERO(FD _ read);
FD _ SET(main stock,FD _ read);
time out . TV _ sec:= 0;
time out . TV _ usec:= 500;
if select (0,@ FD _ read,nil,nil,@ time out)> 0 Then//至少有一个连接
begin
if FD _ isset(main stock,FD _ read)Then
begin
for I:= 0 to FD _ read . FD _ count-1do//注意FD _ count begin
len:= sizeof(addr);
as ock:= accept(main stock,addr,len);
如果是无效套接字,则
...//为asock创建一个新线程,在新线程中选择
end;
end;
end;
end;//while(不是self。已终止)

关机(MainSock,SD _ BOTH);
close socket(main stock);
end;

二:WSAAsyncSelect模型

后来陈先生用了微软的新邮箱。这种邮箱很高级。一旦邮箱里有新的信件,盖茨就会给陈先生打电话:嘿,爷爷,你有新的信件!从此,陈先生再也不用频繁的上下楼查看邮箱了,牙齿也不疼了。看看它,蓝天...不,微软。......

微软提供的WSAAsyncSelect模型就是这个意思。

WSAAsyncSelect模型是Windows下最简单易用的Socket I/O模型。使用这种模式时,Windows会以消息的形式通知应用程序网络事件。

首先,定义一个消息标记常量:

const WM _ SOCKET = WM _ USER+55;
在主窗体的私有域中再添加一个处理此消息的函数声明:private
Procedure WM Socket(varmsg:t message);消息WM _ SOCKET
那么你可以使用WSAAsyncSelect:var
addr:TSockAddr;
sock:t socket;

sock := socket( AF_INET,SOCK_STREAM,IP proto _ TCP);
addr . sin _ family:= AF _ INET;
addr . sin _ port:= htons(5678);
addr.sin_addr。s _ addr:= htonl(in addr _ ANY);
bind( m_sock,@addr,sizeof(SOCKADDR));

WSAAsyncSelect( m_sock,Handle,WM_SOCKET,FD_ACCEPT或FD _ CLOSE);

听(m_sock,5);
......

应用程序可以分析接收到的WM_SOCKET消息,以确定哪个套接字生成了网络事件和事件类型:ProcedureTFM Main。WM套接字(var msg:t message);
var
sock:TSocket;
addr:TSockAddrIn;
addrlen:Integer;
buf : Array [0..4095]的字符;
WParam of BEGIN
/MSG是生成网络事件的套接字句柄,而LParam包含事件类型
CASE WSAGETSELECTEVENT(MSG . LParam)of
FD _ ACCEPT:
BEGIN
adren:
sock:= ACCEPT(MSG。WParam,addr,addrlen);
if sock INVALID _ SOCKET then
WSAAsyncSelect(sock,Handle,WM_SOCKET,FD_READ或FD_WRITE或FD _ CLOSE);
end;

FD_CLOSE : closesocket( Msg。WParam);
FD_READ : recv( Msg。WParam,buf[0],4096,0);
FD _ WRITE:;
end;
end;

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 基于Delphi的SocketIO模型全接触

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情