love5173 发表于 2011-6-22 17:37:36

此代码会造成网络堵塞!求高手优化!

本帖最后由 love5173 于 2011-6-22 17:39 编辑

这个是帮人写的一个小工具就是有GM 问话的时候给报警一下,但是经常会出现堵塞网络造成别的程序不能通信,我也不敢说一定这个代码的问题,我先发下代码,大家看看!
因为里面牵扯到跟服务器通信,但是多连接我不会,所以照抄了别人的部分代码,见笑了!#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_icon=C:\WINDOWS\system32\SHELL32.dll|-19
#AutoIt3Wrapper_outfile=..\程序\rift报警\监控RIFT.exe
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
;~ by yeqing880
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
;Opt('MustDeclareVars', 1)
TCPStartUp()

;AdlibRegister ("Mem",3000)
Global $Socket

conn()

While 1
        $sRecv=TCPRecv($Socket,7788,1)
                        If @error Then
                        AdlibUnRegister ("sendx")
            AdlibUnRegister ("GMCALL")
                       
                        conn()
                        EndIf

WEnd

;While 1
;Sleep(1000)      
;WEnd

Func Sendx() ;报告服务器在线
      $ssend=TCPSend ($Socket,StringToBinary("online",4))
EndFunc

Func conn() ;开始连接
Do
Sleep (1000)
$Socket = TCPConnect(FileRead("\\192.168.0.88\wanghongbo\报警IP.txt"),7788)
Until $Socket <> -1
AdlibRegister ("GMCALL",6000)
AdlibRegister ("sendx",5000)
EndFunc

Func Mem();释放内存
      Local $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, _
      'int', False, 'int', @AutoItPID)
      Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle)
      DllCall("kernel32.dll" , 'int', 'CloseHandle', 'int', $ai_Handle)
EndFunc
Func GMCALL() ;GM报警
        ;MsgBox(0,"","time",1)
        Iflook() Then
        ;$szData ="GMcall....."
            ;If @error Or $szData = "" Then ExitLoop
        TCPSend ($Socket,StringToBinary("GMcall",4))
        GUICreate("报警",@DesktopWidth,@DesktopHeight,0,0,-1)
        GUICtrlCreateLabel("GM报警", -1, -1, @DesktopWidth, @DesktopHeight)
        GUICtrlSetFont(-1, 300, 800, 0, "MS Sans Serif")
    GUICtrlSetColor(-1, 0xFF0000)
    GUISetState(@SW_SHOW)
                          
While 1
WinSetOnTop("报警","",1)
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then
AdlibUnRegister ("sendx")
AdlibUnRegister ("GMCALL")
TCPShutdown()

Exit
EndIf
WEnd
EndIf
EndFunc
Func look() ;查找像素
        AutoItSetOption ("WinTitleMatchMode",2)
       
        If ProcessExists("RIFT.exe")<>0 Then
        $array=WinList("RIFT","")
        ;MsgBox(0,"",$array)
                ;While IsArray($array)
                ;        Sleep(5000)
                For $i=1 To $array
                $pos= WinGetPos($array[$i])
                PixelSearch ($pos+10,$pos+$pos-40,$pos+$pos-160,$pos+100,0xF059A3,3,2,$array[$i])
                If Not @error Then
                PixelSearch ($pos+10,$pos+$pos-40,$pos+$pos-160,$pos+100,0xB7477D,3,2,$array[$i])
                If Not @error Then
                        ;MsgBox(0,"","find")
                Return 1
                EndIf
          Else
                ;MsgBox(0,"","no")
        Return 0
EndIf
                Next
;      WEnd
Else
        Return 0
        EndIf
EndFunc

                          

daiyu116 发表于 2011-6-22 18:16:06

第39行
$Socket = TCPConnect(FileRead("\\192.168.0.88\wanghongbo\报警IP.txt"),7788)
FileRead("\\192.168.0.88\wanghongbo\报警IP.txt")返回是不是完整的IP呢?

daiyu116 发表于 2011-6-22 18:18:07

回复 2# daiyu116
还是觉得应该把这块改一下:
Do
Sleep (1000)
$Socket = TCPConnect(FileRead("\\192.168.0.88\wanghongbo\报警IP.txt"),7788)
Until $Socket <> -1
况且TCPConnect不成功,@error值也不只是-1,还有0的情况呢

love5173 发表于 2011-6-22 22:56:04

回复 3# daiyu116

是完整的IP,你觉得造成网络堵塞的是这个地方吗?

daiyu116 发表于 2011-6-23 13:59:01

回复 4# love5173

      这个地方应该不会造成拥堵,请看41,42句。意思分别是每6秒调用一次GMCALL函数,再每5秒调用一次sendx函数,是不是有可能是这里的问题呢?这时套接字肯定是没释放的。
      而且逻辑上有点不通畅。请LZ再整理下代码吧。

love5173 发表于 2011-6-23 15:13:04

本帖最后由 love5173 于 2011-6-23 15:19 编辑

回复 5# daiyu116
谢谢,我再改改
在23行 我增加了TCPCloseSocket ($Socket)代码,程序继续测试中, 希望有发现其他错误的给予指正,不胜感激
页: [1]
查看完整版本: 此代码会造成网络堵塞!求高手优化!