存档

文章标签 ‘综合’

WinSock痰亩嗑程式控制制

2007年9月25日 没有评论

作者:赵跃龙 张 兵 (中南大学计算机系)

【摘要】本文通过对WinSock的分析,在Delphi下进行了客户段和服务器端的多线程控制,以提高在网络上的数据传输性能!

【关键词】Winsock, Thread

1、引言

Windows Sockets规范以U.C. Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套Microsoft Windows下网络编程接口。它不仅包含了人们所熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。

Windows Sockets 规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。此外,在一个特定版本Windows的基础上,Windows Sockets 也定义了一个二进制接口(ABI),以此来保证应用Windows Sockets API 的应用程序能够在任何网络软件供应商的符合Windows Sockets协议的实现上工作。因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。我们可以使用WinSock在Internet上传输数据和交换信息,而且可以不需要关心网络连接的细节,因而很受网络编程程序员的欢迎。

2、Delphi中Socket的操作方式

Delphi分别使用TClientSocket元件和TServerSocket元件来操纵客户端 Socket和服务器段Socket的连接和通信。根据连接发起的方式以及本地 Socket要连接的目标,Socket之间的连接可以分为:客户端连接、监听连接以及服务器端连接。

(1)所谓客户端连接,是指由客户端的 Socket提出连接请求,要连接的目标是服务器端的Socket。为此,客户端的Socket首先要描述它要连接的服务器端Socket,主要是服务器端Socket的地址和端口号,然后再定位所要连接的服务器端Socket。找到以后,就向服务器端Socket请求连接。此时,服务器端的Socket未必正好处于准备好状态。不过,服务器端Socket会自动维护一个客户请求队列,通过这个队列的优先顺序,会在适当的时候通过请求响应的方式向客户端Socket发出“允许连接”(Accept)的信号,这样便在客户端和服务器端通过Sockets建立了连接!

(2)所谓监听连接,是指服务器端Socket并不定位具体的客户端Socket,而是处于等待连接状态,当服务器端 Socket监听到或者接收到客户端Socket的连接请求的时候,它就响应客户端Socket的请求建立一个新的Socket句柄并与客户端连接,而服务器端Socket继续处于监听状态,这样可以与多个客户端同时建立连接。

(3)所谓服务器端连接,是指当服务器端Socket接收到客户端Socket的连接请求后,就把服务器端Socket的描述发送给客户端。一旦客户端确认了此描述,就建立了连接!

3、线程控制的提出

一旦服务器与客户端建立了连接之后,就可以通过 Internet 传输数据和文件。但是在WinSock中存在两种传输模式“阻塞”和“非阻塞”的概念。

一般都采用非阻塞方式。在客户端,如果把 ClientType特性设置为ctNonBlocking,表示采用非阻塞方式进行连接。当服务器端 Socket试图进行读/写操作的时候,客户端 Socket就会得到通知,即OnRead或者OnWrite事件。

对于服务器端Socket来说,如果把ServerType特性设置为 StNonBlocking,表示采取非阻塞方式进行连接。当客户端 Socket试图进行读/写的时候,服务器端Socket就会得到通知,即OnClientRead或者OnClientWrite事件。

与非阻塞方式不同的是,在阻塞方式下没有诸如OnRead或者OnWrite等异步事件。Socket必须主动去读或者写数据。在读写操作完成之前,其他代码都无法执行,成为了纯粹的独占使用方式,整个应用程序将处于等待状态,大大降低应用程序的性能。

对于客户端Socket来说,如果把 ClientType特性设置为ctBlocking,表示采取阻塞方式进行连接,为了尽可能的减少阻塞方式的负面影响,可以把所有涉及到读写的操作放在一个单独的线程中,这样可以使其他的线程可以继续得到执行。

对于服务器端 Socket来说,如果把ServerType设置为stThreadBlocking,表示采取阻塞方式进行连接。Delphi 中将为每一个阻塞方式的连接自动分配一个新的线程,这样即使一个客户正在进行读写操作,其他的客户也不必等待。

4、在客户端使用多线程技术

在阻塞模式下,为了尽可能的减少阻塞方式的副作用,可以把所有的涉及到读写操作放在一个单独的线程种。为此,需要创建一个新的线程对象,然后重载它的Execute方法,在线程代码中,我们通过TWinSockStream对象来进行读写操作。

Procedure TClientThread.Execute;

Var sStream: TWinSockStream;
sBuffer: string;

Begin

//建一个TWinSocketStream对象实例,设置连接超时

SSteam: = TWinSockStream.Create (ClientSocket.Socket, 60000);

Try //获取和操作命令,直到连接断开或者线程终止

While (not Terminate) and (ClientSocket.Active) do

begin

try

GetNextRequest (sBuffer);

//将请求写回到Server

sStream.Write (sBuffer, Length (sBuffer) + 1);

Except

if not(Except Object is EAbort) then

//处理一些自定义的异常情况

Synchronize(HandleThreadException);

end;

end;

finally

sStream.Free;

end;

End;

5、在服务器端使用多线程技术

在服务器端,Delphi将自动为每一个阻塞方式的连接分配一个新的线程,并通过TServerClientThread来操纵每一个线程。所以不能通过对象库中的向导来创建线程对象,只能手工建立一个TServerClientThread的派生类,然后重载ClientExcute方法。

Procedure TServerThread.ClientExcute;

Var sStream:TWinSocketStream;

sBuffer:array[0..9] of char

Begin

//获取和操作命令,直到连接断开或者线程终止

While (not Terminate) and (ClientSocket.Active) do

Begin

Try

sStream:= TWinSocketStream.Create(ClientSocket.Socket,60000);

try //填充SBuffer数组

FillChar(sBuffer,10,0);

//延迟时间60秒

If sStream.WaitForData(60000) then

Begin

If sStream.Read(sBuffer,10)=0 then

ClientSocket.Close;

……

End

Else ClientSocket.Close;

except

HandleException;

end;

Finally

sStream.Free;

end;

end;

End;

总结:通过客户端和服务器端的多线程控制,当我们需要对大信息量的数据处理的时候,尤为方便,而且能够很大程度上提高网络资源的利用率。目前我们正在研究通过线程控制来对数据库的查询进行优化处理以及数据发送问题!

新家~~最近还是再弄编程

2007年9月25日 没有评论

来源:源码天空

1,获得MEMO中的光标位置.

Lops:=SendMessage(memol.Handle,EM_LINEFROMCHAR,Memol.SelStart,0);//光标所在的行号
Cpos:=SendMessage(meno1.Handle,EM_LINEINDEX,Lpos,0);//光标所在的字符位置
LineLength:=SendMessage(memol.handle,EM_LINELENGTH,Cpos,0);//这行的字符数.

2,开关显示器.

SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0);//关闭显示器.
SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);//打开显示器
.
3,有人问我如何让Memo翻页,我试了一下,

Next:
sendmessage(memo1.handle,wm_keydown,VK_NEXT,-1);
sendmessage(memo1.handle,wm_keyup,VK_NEXT,-1);

Prev:
sendmessage(memo1.handle,wm_keydown,VK_PRIOR,-1);
sendmessage(memo1.handle,wm_keyup,VK_PRIOR,-1);

分类: 混论分类 标签: , ,

2007-07-28 | 做外挂真辛苦~~

2007年9月25日 没有评论

弄了好几天的外挂了..太累了..这里总结下:

     感觉就是重新学习编程一样,唯一的好处就是能看懂前人的知识,比哪些刚入门的好些.开始做武林外传的外挂.不过研究研究发现资料实在太多了.本来就是个懒人..弄那么多现成的资料,诱惑我嘛...所以换成了不太多人弄的完美国际,不过刚开始就遇到了挫折...同样的CALL远程注入用到完美里就内存错误...让我好是郁闷了一上午...经过不停的调试,终于找到了错误..原来CALL的地址写错了....倒..自己钻研的痛苦啊...对了,找了好多朋友同学...没人响应我..55555失败啊.经过一天的辛苦终于完成了一个CALL的调用.之后又突发奇想的想写个特征码搜索器好省去以后总是搜索地址的麻烦..当然这也是看到前人有这么做的.觉得真是个好方法....不过我的苦难也开始了...没想到这方面的资料网络上基本没有啊....现在,终于算是完成了.呵呵.当然现在搜索到也是现在我唯一掌握的打坐CALL地址呵呵.慢慢来吧~~学习真辛苦~~呵呵

分类: 混论分类 标签: , , ,

2007-07-22 | 心太软

2007年9月25日 没有评论

2007-07-22 | 心太软

标签: 心太软  雨伞  忘记  

有的时候真的很狠自己的,心总是放不下。

    昨天下了一天的雨。拿着大学时用的雨伞。走在长春的大街上,看着手中的雨伞,想起来了她,时间走的好快。点滴的往事还是让我不能忘记。人总是说着忘记忘记。可是还是在不停的回忆。当时和她一起买伞,一起修伞,她是那么手巧。

    和她吵架真是后悔,有些事情本来就没有对错的。可是年少的我们本来就是这样。冲动,激情。对?错?谁又知道呢。和她可能再也没机会见面了。。。

不知道未来的生活里是否还会遇到让我感动的女孩子。不需要生死的考验,只要点滴之间。女孩的美丽不一定是样貌,她的细腻和温柔才是最感动人的。样貌会老去,但细腻不会。每个人有各式各样的性格,但都有一颗温柔的心,不管他是好人是坏人。心都有最柔软的地方。~~~女孩总是会找到的。很佩服女孩。上帝创造女孩,可能就是来克制男孩的吧。呵呵~~~ ^-^ 调皮

分类: 混论分类 标签: , , ,

2007-07-19 | 今天的今天

2007年9月25日 没有评论

2007-07-19 | 今天的今天

标签: BEGIN  序幕  

     有句广告词说:明天的明天,你还会送我水晶之恋吗?,呵呵。时间过的好快。今天都已经7月份了。大学的忙碌已经离我远去。新的人生轨迹开始绘画,不过显然还没有把自己从学生转移到大人的觉悟~ 讽刺

     这里好久没有更新。应该在界面上放点草。来表示下。今天本来是“搬家”的~~~没想到几个月没来看,竟然还有朋友写了评论。心里忽然暖暖的。是啊。生活就是这样不经意间。带着点伤感,带着些喜悦。本想走的潇洒,却发现自己其实也很放不下。不过还好。几年的时间终于从感情的怪圈里走了出来。从年少无知的喜欢,到迷迷茫茫的爱情,失恋对当时的我应该是一种好的“打击”。否则真不敢想象自己被“甜蜜”包围后的颓废。大学对我来说又好又坏,知识上让我觉得很痛心,四年的时间学到的有用知识,也许一个手就可以数的清楚。为佳木斯大学计算机系的学生感到悲哀。毕业答辩的时候竟然把老师难住了。。真是佩服老师的水平。感情上让我成长了。明白爱那估计是扯淡,不过不会那么幼稚的以为爱情就是喜欢。长大了。长大了。

     我改变自己的为人处世了。因为长大了。过去可以自由自在,现在开始学着做个“坏人”。因为我要去很多“坏人”的地方。只有这样我才能战胜他们~这是我的责任,也是未来的奋斗。

分类: 混论分类 标签: , , ,