基于Delphi的Socket I/O模型全接触(总结) [转]
转自大富翁http://www.delphibbs.com/keylife/iblog_show.asp?xid=30049
老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系。他们的信会被邮递员投递到他们的信箱里。
这和Socket模型非常类似。下面我就以老陈接收信件为例讲解Socket I/O模型。
一:select模型
老陈非常想看到女儿的信。以至于他每隔10分钟就下楼检查信箱,看是否有女儿的信,在这种情况下,“下楼检查信箱”然后回到楼上耽误了老陈太多的时间,以至于老陈无法做其他工作。
select模型和老陈的这种情况非常相似:周而复始地去检查......如果有数据......接收/发送.......
使用线程来select应该是通用的做法:
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;
二:WSAAsyncSelect模型
后来,老陈使用了微软公司的新式信箱。这种信箱非常先进,一旦信箱里有新的信件,盖茨就会给老陈打电话:喂,大爷,你有新的信件了!从此,老陈再也不必频繁上下楼检查信箱了,牙也不疼了,你瞅准了,蓝天....
相关文档:
//声明:
GetWindowText(
hWnd: HWND; {窗口句柄}
lpString: PChar; {接收文本的缓冲区的指针}
nMaxCount: Integer {指定缓冲区大小, 其中包含NULL字符; 如果文本超出,会被被截断}
): Integer; {返回字符个数, 不包括中断的空字符; 如果标题为空或句柄无效, 则返回零}
//举例:
var
arr: ......
本书通过典型的实例,系统地介绍了Delphi典型组件的基本使用方法和一些使用技巧。每一个实例都提供了程序的源代码、操作步骤,并且在一些特殊的实例中注明了知识点。力争使读者通过阅读实例后,可以较好地掌握每一个知识点。 本书分为五章,内容由浅入深、循序渐进,适用于初级用户和院校师生学习参考。 下载阅读边用边学D ......
Delphi 中将对象作为参数传递的使用 举例分析
2009-07-24 13:40
下面的单击事件,将要调用一个以对象为参数的方法,并将结果显示出来。
procedure TForm1.btn1Click(Sender: TObject);
var
lStrings: TStrings;
begin
lStrings:= TStringList.Create;
try
lStrings.Add('chen');
&nbs ......
数组是可以通过索引来引用的同类型数据的列表。按照存储空间的获取方式,Delphi
支持的数组类型有两种,即静态数组和动态数组。所谓静态数组就是在声明时就已经确定大小的数组类型,而动态数组是指其大小在声明时不能确定的数组,动态数组的大小在使用时确定。
声明静态数组的方式非常简单,只要指明数组长度和数据类型 ......
今天用delphi 2010,做一个简单的内存映射的程序,在delphi以前版本上跑的好好的程序,在2010上,居然出现了不同的效果,发送端发送的字符串,接收端只收到一半,大概程序如下:
发送端:
var
str : String;
begin
CopyMemory(@(PShare^.Data),str,Length(str)); //把数据拷贝到 ......