国际棋牌

 
 加入
查看: 400|回复: 18

如何 用tcp实现远程关机、重启-国际棋牌

[复制链接]
发表于 2023-10-5 10:09:08 | 显示全部楼层 |
如何 用tcp实现远程关机、重启
发表于 2023-10-5 14:48:46 | 显示全部楼层
请附上你的思路和代码,否则没人会理你...


===================
 楼主| 发表于 2023-10-5 16:33:54 | 显示全部楼层
本帖最后由 wllx 于 2023-10-5 17:11 编辑

请附上你的思路和代码,否则没人会理你...


  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include
  11. #include
  12. #include
  13. #include
  14. #include
  15. #include
  16. #include
  17. #include
  18. #include
  19. _winapi_wow64enablewow64fsredirection(false)
  20. local $cofing = @scriptdir & "\wim\jydn\lan.ini", $fonts = "微软雅黑"
  21. _skins3()
  22. local $tcpport = 8411, $tcpip = @ipaddress1
  23. local $_tcp_hsockets[1][10], $recvone = 0, $delsocket = -1, $connectedsocket, $recvtcp = 0
  24. local $tcprecvmode, $postsk, $mainstr = "####", $recvbtos, $recvold, $error
  25. local $mainsocket = tcplisten($tcpip, $tcpport)
  26. local $mht = guicreate("远程控制", 326, 500)
  27. local $listview3 = guictrlcreatelistview("", 10, 10, 306, 480)
  28. _guictrllistview_settextbkcolor($listview3, 6027594)
  29. _guictrllistview_addcolumn($listview3, "", 0)
  30. _guictrllistview_addcolumn($listview3, "socket", 0)
  31. _guictrllistview_addcolumn($listview3, "客户端名称", 145, 2)
  32. _guictrllistview_addcolumn($listview3, "客户端ip地址", 145, 2)
  33. $listmenu = guictrlcreatecontextmenu($listview3)
  34. $reboot= guictrlcreatemenuitem("重启客户端", $listmenu)
  35. guictrlsetfont(-1, 9, 400, 1, $fonts)
  36. $boot = guictrlcreatemenuitem("关闭客户端", $listmenu)
  37. guictrlsetfont(-1, 9, 400, 1, $fonts)
  38. $tightvnc= guictrlcreatemenuitem("连接客户端", $listmenu)
  39. guictrlsetfont(-1, 9, 400, 1, $fonts)
  40. guisetstate()
  41. tcpstartup()
  42. local $mainsocket = tcplisten(iniread($cofing, "lan", "tcpip ", ""), $tcpport)
  43. guiregistermsg($wm_command, "wm_notify")
  44. mytcp_server($tcpip, $tcpport)
  45. while 1
  46.         _tcprecv()
  47.         _while()
  48. wend

  49. func _while()
  50.         $nmsg = guigetmsg()
  51.         switch $nmsg
  52.                 case $gui_event_close, $idclose
  53.                         exit
  54.         endswitch
  55. endfunc   ;==>_while

  56. func quit()
  57.         tcpshutdown()
  58.         exit
  59. endfunc   ;==>quit
  60. func wm_notify($hwnd, $imsg, $iwparam, $ilparam)
  61.         local $hwndfrom
  62.         $hwndfrom = $ilparam
  63.         switch $iwparam
  64.                 case $tightvnc
  65.                         $index = controllistview($mht, "", "[class:syslistview32; instance:1]", "getselected", 3)
  66.                         if $index <> "" then
  67.                                 $ip = controllistview($mht, "", "[class:syslistview32; instance:1]", "gettext", $index, 3)
  68.                                 traytip("通知", " " &"正在连接" &"☛"& $ip  , 1, 1)
  69.                                 run(@comspec & " /c " & @scriptdir & "\dysoft\tvnviewer.exe" & " " & $ip, @scriptdir, @sw_hide)
  70.                         endif
  71.                         return true
  72.                 case $reboot
  73.                           $index = controllistview($mht, "", "[class:syslistview32; instance:1]", "getselected", 3)
  74.                              if $index <> "" then
  75.                                 $ip = controllistview($mht, "", "[class:syslistview32; instance:1]", "gettext", $index, 3)
  76.                                 traytip("通知", " " &"正在重启" &"☛"& $ip  , 1, 1)
  77.                                 run(@comspec & ' /c ' & 'shutdown -m \\' & $ip & ' -r -f -t 0', '@scriptdi', @sw_hide)
  78.                         endif
  79.                         return true
  80.         case $boot
  81.                           $index = controllistview($mht, "", "[class:syslistview32; instance:1]", "getselected", 3)
  82.                              if $index <> "" then
  83.                                 $ip = controllistview($mht, "", "[class:syslistview32; instance:1]", "gettext", $index, 3)
  84.                                 traytip("通知", " " &"正在关机" &"☛"& $ip  , 1, 1)
  85.                                 run(@comspec & ' /c ' & 'shutdown -m \\' & $ip & ' -s -f -t 0', '@scriptdi', @sw_hide)
  86.                         endif
  87.                         return true
  88.         endswitch
  89. endfunc   ;==>wm_notify

  90. func mytcp_server($tcpip, $tcpport)
  91.   local $ilistensocket = tcplisten($tcpip, $tcpport , 250)
  92.     local $ierror = 0
  93.     if @error then
  94.         $ierror = @error
  95.         return false
  96.     endif
  97.     local $isocket = 0
  98.     do
  99.         $isocket = tcpaccept($ilistensocket)
  100.         if @error then
  101.             $ierror = @error

  102.             return false
  103.         endif
  104. if guigetmsg() = $gui_event_close then return false
  105.     until $isocket <> -1
  106.     tcpclosesocket($ilistensocket)
  107.     local $sreceived = tcprecv($isocket, 4)
  108.     tcpclosesocket($isocket)
  109. endfunc   ;==>mytcp_server

  110. func _tcprecv()
  111.         local $regsocket = -1, $regip, $rdays
  112.         dim $regsocket = tcpaccept($mainsocket)
  113.         if $regsocket <> -1 then
  114.                 dim $recv_1 = tcprecv($regsocket, 1024 * 1024, 1)
  115.                 if @error then
  116.                         $error = int(@error)
  117.                 endif
  118.                 if $recv_1 <> "" then
  119.                         $checkdata = stringleft($recv_1, 12)
  120.                         if $checkdata = "0x232323232b" then
  121.                                 $regip = sockettoip($regsocket)
  122.                                 $recvbtos = binarytostring($recv_1, 4)
  123.                                 $rdays = stringsplit($recvbtos, " ", 1)
  124.                                 if isarray($rdays) then
  125.                                         if ubound($rdays) > 3 then
  126.                                                 if stringupper($rdays[4]) = stringupper("sendname") then
  127.                                                         _socketact($regsocket, $regip, $rdays[5], "sendname")
  128.                                                         dim $onlinepclist = ""
  129.                                                         for $i = 1 to ubound($_tcp_hsockets) - 1
  130.                                                                 $onlinepclist = $onlinepclist & $_tcp_hsockets[$i][0] & "|" & $_tcp_hsockets[$i][2] & ","
  131.                                                         next
  132.                                                 endif
  133.                                         endif
  134.                                 endif
  135.                         endif
  136.                 endif
  137.         else
  138.                 if (ubound($_tcp_hsockets)) > 1 then
  139.                         for $i = 1 to ubound($_tcp_hsockets) - 1
  140.                                 dim $recv_1 = tcprecv($_tcp_hsockets[$i][0], 1024 * 1024, 1)
  141.                                 if @error then
  142.                                         $error = int(@error)
  143.                                         if $error = 10054 then
  144.                                                 if $_tcp_hsockets[$i][0] <> -1 then
  145.                                                         $delsocket = $_tcp_hsockets[$i][0]
  146.                                                         tcpclosesocket($_tcp_hsockets[$i][0])
  147.                                                 endif
  148.                                         endif
  149.                                 endif
  150.                                 if $recv_1 <> "" then
  151.                                         $postsk = $_tcp_hsockets[$i][0]
  152.                                 endif
  153.                         next
  154.                         if $delsocket <> -1 then
  155.                                 _tcp_server_broadcast($delsocket, "offline")
  156.                         endif
  157.                 endif
  158.         endif
  159. endfunc   ;==>_tcprecv

  160. func _socketact($socketid = -1, $socketip = "", $socketname = "", $mode = "add")
  161.         if $socketid <> -1 and $socketip <> "" and $socketname <> "" then
  162.                 dim $name_and_ip = $socketname & "|" & $socketip
  163.                 dim $so_name_and_ip = _arrayfindall($_tcp_hsockets, $socketid, 0, 0, 0, 0, 0)
  164.                 if isarray($so_name_and_ip) then
  165.                         tcpclosesocket($_tcp_hsockets[$so_name_and_ip[0]][0])
  166.                         $_tcp_hsockets[$so_name_and_ip[0]][0] = $socketid
  167.                         $_tcp_hsockets[$so_name_and_ip[0]][3] = 1
  168.                         assign("gsocket" & $socketid, $so_name_and_ip[0], 2)
  169.                         _tcp_server_broadcast($socketid, "online")
  170.                 else
  171.                         dim $recvubound = ubound($_tcp_hsockets)
  172.                         redim $_tcp_hsockets[$recvubound 1][10]
  173.                         $_tcp_hsockets[$recvubound][0] = $socketid
  174.                         $_tcp_hsockets[$recvubound][1] = $socketip
  175.                         $_tcp_hsockets[$recvubound][2] = $name_and_ip
  176.                         $_tcp_hsockets[$recvubound][3] = 1
  177.                         assign("gsocket" & $socketid, $recvubound, 2)
  178.                         _tcp_server_broadcast($socketid, "online")
  179.                 endif
  180.         endif
  181. endfunc   ;==>_socketact

  182. func _tcp_server_broadcast($stext = "", $sendtype = "msg")
  183.         if stringupper($sendtype) = stringupper("online") or stringupper($sendtype) = stringupper("offline") then
  184.                 dim $stexta = $_tcp_hsockets[eval("gsocket" & $stext)][0] & "|" & $_tcp_hsockets[eval("gsocket" & $stext)][2]
  185.                 _clientline($stexta, $sendtype)
  186.         else
  187.                 dim $stexta = $stext
  188.         endif
  189.         if (ubound($_tcp_hsockets)) > 1 then
  190.                 dim $sendmsg = stringtobinary($mainstr & " 0 " & $sendtype & " " & $stexta & ", ", 4)
  191.                 for $i = 1 to ubound($_tcp_hsockets) - 1
  192.                         if stringupper($sendtype) = stringupper("online") or stringupper($sendtype) = stringupper("offline") then
  193.                                 if ubound($_tcp_hsockets) > $i then
  194.                                         if $_tcp_hsockets[$i][0] and $_tcp_hsockets[$i][0] <> $stext then
  195.                                                 tcpsend($_tcp_hsockets[$i][0], $sendmsg)
  196.                                                 if @error then
  197.                                                         $error = int(@error)
  198.                                                         if $_tcp_hsockets[$i][0] <> -1 then
  199.                                                                 $delsocket = $_tcp_hsockets[$i][0]
  200.                                                                 tcpclosesocket($_tcp_hsockets[$i][0])
  201.                                                         endif
  202.                                                         if $delsocket <> -1 then
  203.                                                                 _tcp_server_broadcast($delsocket, "offline")
  204.                                                         endif
  205.                                                 endif
  206.                                         endif
  207.                                 endif
  208.                         else
  209.                                 if $_tcp_hsockets[$i][0] then
  210.                                         tcpsend($_tcp_hsockets[$i][0], $sendmsg)
  211.                                         if @error then
  212.                                                 $error = int(@error)
  213.                                                 if $_tcp_hsockets[$i][0] <> -1 then
  214.                                                         $delsocket = $_tcp_hsockets[$i][0]
  215.                                                         tcpclosesocket($_tcp_hsockets[$i][0])
  216.                                                         if $delsocket <> -1 then
  217.                                                                 _tcp_server_broadcast($delsocket, "offline")
  218.                                                         endif
  219.                                                 endif
  220.                                         endif
  221.                                 endif
  222.                         endif
  223.                 next
  224.                 if $delsocket <> -1 then
  225.                         _arraydelete($_tcp_hsockets, eval("gsocket" & $delsocket))
  226.                         assign("gsocket" & $delsocket, -1, 2)
  227.                         $delsocket = -1
  228.                 endif
  229.         endif
  230. endfunc   ;==>_tcp_server_broadcast

  231. func _clientline($sonlineipstr = "", $sonlinemode = "")
  232.         if $sonlineipstr <> "" then
  233.                 dim $sonlinesp = stringsplit($sonlineipstr, "|", 1)
  234.                 if isarray($sonlinesp) then
  235.                         if ubound($sonlinesp) > 3 then
  236.                                 dim $sonlinesocket = $sonlinesp[1]
  237.                                 dim $sonlinename = $sonlinesp[2]
  238.                                 dim $sonlineip = $sonlinesp[3]
  239.                                 dim $getitemcount = _guictrllistview_getitemcount($listview3)
  240.                                 dim $sonline_id = _guictrllistview_findintext($listview3, $sonlinename & "|" & $sonlineip)
  241.                                 if $sonline_id <> -1 then
  242.                                         if stringupper($sonlinemode) = stringupper("offline") then
  243.                                                 traytip("通知", " " & $sonlineipstr & "已断开", 1, 1)
  244.                                                 _guictrllistview_deleteitem(guictrlgethandle($listview3), $sonline_id)
  245.                                         else
  246.                                                 traytip("通知", " " & $sonlinename & "已连接.", 1, 1)
  247.                                                 _guictrllistview_setitem($listview3, $sonlinesocket, $sonline_id, 1)
  248.                                         endif
  249.                                 else
  250.                                         if stringupper($sonlinemode) = stringupper("online") then
  251.                                                 traytip("通知", " " & $sonlinename & "已连接.", 1, 1)
  252.                                                 _guictrllistview_additem($listview3, $sonlinename & "|" & $sonlineip, $getitemcount)
  253.                                                 _guictrllistview_addsubitem($listview3, $getitemcount, $sonlinesocket, 1, 1)
  254.                                                 _guictrllistview_addsubitem($listview3, $getitemcount, $sonlinename, 2, 1)
  255.                                                 _guictrllistview_addsubitem($listview3, $getitemcount, $sonlineip, 3, 1)
  256.                                         endif
  257.                                 endif
  258.                         endif
  259.                 endif
  260.         endif
  261. endfunc   ;==>_clientline

  262. func sockettoip($shocket)
  263.         local $sockaddr, $aret
  264.         $sockaddr = dllstructcreate("short;ushort;uint;char[8]")
  265.         $aret = dllcall("ws2_32.dll", "int", "getpeername", "int", $shocket, "ptr", dllstructgetptr($sockaddr), "int*", dllstructgetsize($sockaddr))
  266.         if not @error and $aret[0] = 0 then
  267.                 $aret = dllcall("ws2_32.dll", "str", "inet_ntoa", "int", dllstructgetdata($sockaddr, 3))
  268.                 if not @error then $aret = $aret[0]
  269.         else
  270.                 $aret = 0
  271.         endif
  272.         $sockaddr = 0
  273.         return $aret
  274. endfunc   ;==>sockettoip

  275. func _skins3()
  276.         fileinstall("d:\au3\skin\享受风格.she", @tempdir & "\1.she", 1)
  277.         fileinstall("d:\au3\skin\skin.dll", @tempdir & "\skin.dll", 1)
  278.         $skins = @tempdir & "\1.she"
  279.         $dll = dllopen(@tempdir & "\skin.dll")
  280.         dllcall($dll, "int", "skinh_attachex", "str", $skins, "str", "mhgd")
  281.         filedelete(@tempdir & "\skin.dll")
  282.         filedelete(@tempdir & "\1.she")
  283. endfunc   ;==>_skins1
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2023-10-5 18:25:07 | 显示全部楼层
這個目前是我還在寫的,還沒寫完,你可以參考看看,重點是連進去後,透過接收字串,符合指定字串就重啟。
流程,
1.被控端開機後背景常駐,此客戶端需要指定一組固定ip,並啟動 tcp listen,待遠端登入。
2.主控端依list 選擇 tcp connect ,等待被控端回應已連線後(可以用回應字串確認已連線),點擊重啟命令,重起命令可以使用特定字串,如 "real-time-reset" 送至被控端。
3.被控端接收字串後,確認符合 real-time-reset 這字串,立即執行 shutdown(6)



  1. #include
  2. #include

  3. opt("trayiconhide", 0)                 ;0 = 顯示托盤圖標, 1 = 隱藏托盤圖標
  4. opt('mustdeclarevars', 1)        ;0 = 變量不需預先聲明, 1 = 變量必需預先聲明
  5. opt("guicloseonesc", 0)         ;0 = 點擊 esc 鍵不關閉1 = 點擊 esc 鍵關閉,

  6. ;local $hgui = guicreate("bs_service",150,100,-1,-1)

  7. tcpstartup() ; 启动 tcp 服务.
  8. local $sipaddress = "127.0.0.1" ; 此 ip 地址仅用于在您自己的计算机上测试.
  9. local $iport = 65432 ; 用于连接的端口.
  10. global $ilistensocket = tcplisten($sipaddress, $iport,5)
  11. if @error then
  12.         local $ierror = @error
  13.     msgbox(bitor($mb_systemmodal, $mb_iconhand), "", "監聽失敗,錯誤代碼: " & $ierror)
  14. else
  15.     msgbox($mb_systemmodal, "", "監聽成功.",1)
  16. endif
  17. global $isocket_1 = -1, $isocket_2 = 0

  18. local $sreceived

  19. ;guisetstate(@sw_show, $hgui)

  20. ; 循环到用户退出.
  21. while 1
  22.         switch guigetmsg()
  23.                 case $gui_event_close
  24.                         tcpclosesocket($ilistensocket)
  25.                         sleep(1000)
  26.                         tcpshutdown()
  27.                         exitloop
  28.         endswitch

  29.         tcpconnlisten()

  30.     if $isocket_1 <> -1 then
  31.                 $sreceived = tcprecv($isocket_1, 10) ;
  32.                 if $sreceived <> "" then
  33.                         msgbox(0,"$sreceived",$sreceived,1)
  34.                         if $sreceived =  "reset" & @crlf then
  35.                                 tcpsend($isocket_1,"reset_ok")
  36.                                 tcpclosesocket($ilistensocket)
  37.                                 $sreceived = ""
  38.                                 $isocket_1 = -1
  39.                                 $isocket_2 = -1
  40.                                 tcpshutdown()
  41.                         else
  42.                                 $sreceived = ""
  43.                         endif
  44.                 endif
  45.         endif
  46. wend

  47. func tcpconnlisten()
  48.         local $ierror = ""
  49.         if $isocket_1 = -1 then
  50.                 if $isocket_2 = -1 then
  51.                         tcpstartup()
  52.                         $ilistensocket = tcplisten($sipaddress, $iport,5)
  53.                         $isocket_2 = 0
  54.                 endif
  55.                 $isocket_1 = tcpaccept($ilistensocket)
  56.                 if @error then
  57.                         $ierror = @error
  58.                         msgbox(bitor($mb_systemmodal, $mb_iconhand), "", "服务器:" & @crlf & "不能接收传入的连接,错误代码: " & $ierror)
  59.                 endif
  60.         endif

  61. endfunc
复制代码
发表于 2023-10-5 20:52:52 | 显示全部楼层
tcp代码比较复杂,用udp实现代码会更加简洁。
发表于 2023-10-5 21:02:52 | 显示全部楼层
  1. global $ipaddress = "127.0.0.1"
  2. global $port = 65432
  3. udpstartup()
  4. myudp_server($ipaddress, $port)
  5. msgbox(0, "", "关机")
  6. exit

  7. func myudp_server($sipaddress, $iport)
  8.         local $isocket = udpbind($sipaddress, $iport)
  9.         if @error then
  10.                 local $ierror = @error
  11.                 msgbox(0, "", "服务器:" & @crlf & "无法绑定,错误代码: " & $ierror)
  12.                 return false
  13.         endif
  14.         local $sreceived = ""
  15.         do
  16.                 $sreceived = udprecv($isocket, 4)
  17.         until $sreceived == "exit"
  18.         udpclosesocket($isocket)
  19. endfunc   ;==>myudp_server
复制代码
发表于 2023-10-5 21:22:57 | 显示全部楼层
本帖最后由 gyp2000 于 2023-10-5 21:27 编辑

tcp协议实现这种简单的功能就比较复杂了。
需要循环监听传入。然后创建连接套接字,远端断开连接后还需要释放套接字。
还需要做连接是否存活的监测,如果连接异常断开还需要释放套接字资源。
由于使用循环效率低,tcp服务端还会使用事件模式来处理远端连接请求、数据接收、远端断开连接这些事件。
一般没特殊需求,很少用tcp协议来处理这种简单需求。
发表于 2023-10-5 23:15:08 | 显示全部楼层
代码没看,我觉得,服务器给客户机发一个指令代码,比如发一个字符串shut,客户端就执行关机命令,发一个字符串restart,客户端就执行重启命令。当然用整数也可以,比如发一个0x01是关机,发一个0x02是重启。大概思路就这样吧。
 楼主| 发表于 2023-10-6 07:21:26 | 显示全部楼层

代码没看,我觉得,服务器给客户机发一个指令代码,比如发一个字符串shut,客户端就执行关机命令,发一个字 ...

思路不等于出路
这个是人家写的进程监视器服务端

#notrayicon
#region ;**** directives created by autoit3wrapper_gui ****
#autoit3wrapper_icon=d:\图标\多彩图标\apps\atom.ico
#autoit3wrapper_outfile=f:\mht_ys_ipxe\进程监视器服务端.exe
#autoit3wrapper_res_comment=进程监视器服务端
#autoit3wrapper_res_description=进程监视器服务端
#autoit3wrapper_res_fileversion=1.0.0.7
#autoit3wrapper_res_fileversion_autoincrement=y
#autoit3wrapper_res_legal国际棋牌 copyright=l4ever qq:425145
#endregion ;**** directives created by autoit3wrapper_gui ****
#notrayicon
#region ;**** 参数创建于 acnwrapper_gui ****
#endregion ;**** 参数创建于 acnwrapper_gui ****

#include
#include
#include
#include
#include
#include "tcp.au3"
#include
_winapi_wow64enablewow64fsredirection(false)
local $cofing = @scriptdir & "\wim\jydn\lan.ini"
_skin()
writelog("信息","程序启动,打开5138端口,并监听.")
_tcp_server_create(5138); 一个新的服务端
_tcp_registerevent($tcp_receive, "receive");收到数据
_tcp_registerevent($tcp_newclient, "newclient");客户端上线
local $itemcount3
global $guiclose=1,$next="none",$wating=0,$message=0,$localip=@ipaddress1,$connected=-1,$remoteip=1

$gui=guicreate("远控服务端",410,500)
$listview = guictrlcreatelistview("       机器名|        ip地址|         提示|             上线时间", 5, 5, 400,490)
guictrlsetfont(-1, 8.5, 400, 0, "微软雅黑")
_guictrllistview_setcolumnwidth($listview, 0, 80)
_guictrllistview_setcolumnwidth($listview, 1, 100)
_guictrllistview_setcolumnwidth($listview, 2, 80)
_guictrllistview_setcolumnwidth($listview, 3, 130)
$listmenu = guictrlcreatecontextmenu($listview)
$clsj = guictrlcreatemenuitem("退出", $listmenu)
guictrlsetfont(-1, 9, 400, 0, "微软雅黑")
$cqgj = guictrlcreatemenuitem("重启", $listmenu)
guictrlsetfont(-1, 9, 400, 0, "微软雅黑")
$gbgj = guictrlcreatemenuitem("关闭", $listmenu)
guictrlsetfont(-1,9, 400, 0, "微软雅黑")
$scgx = guictrlcreatemenuitem("删除", $listmenu)
guictrlsetfont(-1, 9, 400, 0, "微软雅黑")
$tightvnc= guictrlcreatemenuitem("连接", $listmenu)
guictrlsetfont(-1, 9, 400, 0, "微软雅黑")
guisetstate()

func receive($ierror, $sreceive)
        $str = stringreplace($sreceive,"killed","已上线")
        writelog("信息","收到客户端发送的报告,内容:"&$str)
        guictrlcreatelistviewitem($str&"|"&@year & "-" & @mon & "-" & @mday & " " & @hour & ":" & @min & ":" & @sec,$listview)
        beep(1000, 500)
endfunc

func newclient()
        writelog("信息","客户端上线")
endfunc

_guictrllistview_registersortcallback($listview)
while $guiclose
        sleep(10)
        $gui=guigetmsg()
        if $gui=$gui_event_close then $guiclose=0
        if $gui=$clsj then
                        _send2client("reset")
        endif

                 if $gui=$cqgj then
            _tcp_server_send("restart")
                         guictrldelete(guictrlread($listview))
                         guictrlsetdata($itemcount3,"待处理事件:"&_guictrllistview_getitemcount($listview))
        endif

                 if $gui=$gbgj then
            _tcp_server_send("shut")
                         guictrldelete(guictrlread($listview))
                         guictrlsetdata($itemcount3,"待处理事件:"&_guictrllistview_getitemcount($listview))
                 endif
                 if $gui=$scgx then
            guictrldelete(guictrlread($listview))
                        guictrlsetdata($itemcount3,"待处理事件:"&_guictrllistview_getitemcount($listview))
                endif
                if $gui=$listview then
                 _guictrllistview_sortitems($listview, guictrlgetstate($listview))
         endif
        wend

func _send2client($str)
        writelog("信息","响应人工操作,开始处理.")
        $listteam = stringsplit(guictrlread(guictrlread($listview)),"|")
                        if not @error then
                        $clientip = $listteam[2]
                        writelog("信息","选中的时间发生时间:"&$listteam[4]&",目标机器:["&$listteam[1]&"]"&$clientip&",事件:"&$listteam[3])
                else
                        writelog("错误","人工操作失败,可能是没选中列表内的项目.")
                        msgbox(16,"错误","请从列表中选中项目再操作.")
                        $clientip =""
                endif
if $clientip<> "" then
        tcpstartup()
        $connected=tcpconnect($clientip,5139)
        if not ($connected > 0) or @error then
                writelog("错误","连接"&$clientip&"失败,错误代码:"&@error)
                        else
                                writelog("信息","连接"&$clientip&"成功.socketid:"&$connected)
                        endif

        $sendresult = tcpsend($connected,$str)
        if $sendresult ="0" or @error then
                        writelog("错误","发送命令"&$str&"到"&$clientip&"失败,错误代码:"&@error)
                        else
                writelog("信息","发送命令"&$str&"到"&$clientip&"成功.")
                guictrldelete(guictrlread($listview))
                guictrlsetdata($itemcount3,"待处理事件:"&_guictrllistview_getitemcount($listview))
        endif
endif
tcpshutdown()
writelog("信息","关闭对该机的连接.")
writelog("信息","响应人工操作完成.")
endfunc

func _skin()
        $pf = iniread($cofing, "pf", "pf", "")
        $skins = @scriptdir & "\skin\" & $pf
        $dll = dllopen(@scriptdir & "\skin\skin.dll")
        dllcall($dll, "int", "skinh_attachex", "str", $skins, "str", "mhgd")
        dllcall($dll, "int", "skinh_setaero", "int", 1)
endfunc   ;==>_skins

func writelog($logact,$logcontent)
        $logfile= @scriptdir &"\"& stringtrimright(@scriptname,4)&".log"
        $logtime = @year & "-" & @mon & "-" & @mday & " " & @hour & ":" & @min & ":" & @sec &"." &@msec
        filewriteline($logfile,  $logtime & " | " & $logact & " | " & $logcontent)
endfunc

############
客户端:

;~ #notrayicon
#region ;**** 参数创建于 acnwrapper_gui ****
#autoit3wrapper_icon=c:\windows\system32\shell32.dll
#autoit3wrapper_outfile=进程监视器.exe
#autoit3wrapper_res_comment=进程监视器
#autoit3wrapper_res_description=进程监视器
#autoit3wrapper_res_fileversion=1.0.0.5
#autoit3wrapper_res_fileversion_autoincrement=y
#autoit3wrapper_res_legal国际棋牌 copyright=l4ever qq:425145
#endregion ;**** 参数创建于 acnwrapper_gui ****
#include "tcp.au3"
global $server = iniread(@scriptdir &"\lan.ini", "lan", "tcpip","")
global $process = iniread(@scriptdir &"\lan.ini", "lan", "进程","")
global $htime = iniread(@scriptdir &"\lan.ini", "lan", "循环时间","")
global $guiclose=1,$wating=0,$message=0,$localip=@ipaddress1,$connected=-1,$connok=0,$pcheckalert=0

if $server ="" or $process ="" then
        writelog("错误","配置错误,程序退出,请检查配置.")
        msgbox(0 16,"错误","配置错误,请检查配置,程序3秒后自动退出。",3)
        exit
endif

global $g_szversion = "processkeeper"
if winexists($g_szversion) then exit
autoitwinsettitle($g_szversion)

writelog("信息","程序启动,开始尝试连接服务端")
connserver()
writelog("信息","开始进行巡检检测,间隔时间为"&$htime&"毫秒")

if $connok = 1 then adlibregister("_pcheck",$htime)

while 1
        sleep(900)
        $command=tcprecv($connected,2048)
        if $command <> "" then
                writelog("信息","接收到服务端命令:"&$command)
                runcommand($command)
                $command = ""
        endif

wend

func runcommand($str1)
        writelog("信息","处理服务端发送的命令"&$str1)
        switch $str1
                case "reset"
                        writelog("信息","服务端要求初始化客户端程序,开始执行.")
                        connserver()
                        if $connok = 1 then adlibregister("_pcheck",$htime)
                case "restart"
                        writelog("信息","服务端要求重启客户机,开始执行.")
                        shutdown(6)
                        writelog("信息","服务端要求关闭客户机,开始执行.")
                case "shut"
                        shutdown(5)
        endswitch

        endfunc

func connserver()
        tcpstartup()
        $connected=tcpconnect($server,5138)
        if not ($connected > 0) or @error then
                writelog("错误","连接服务端失败,2秒后重试.错误代码:"&@error)
                                tcpshutdown()
                                sleep(2000)
                                connserver()
                                if $connok = 1 then adlibregister("_pcheck",$htime)
                        else
                                writelog("信息","连接服务端成功.socketid:"&$connected)
                                global $connok = 1
        endif
endfunc

func _pcheck()
if not processexists($process) then
                writelog("信息","客户端巡检检测发现异常,休眠2秒再次检测.")
                sleep(2000)
                if not processexists($process) then
                        writelog("信息","客户端巡检检测异常确认,开始向服务端发送报告.")
                        _senddata("killed")
                        writelog("信息","停止客户端巡检检测.")
                        adlibunregister("_pcheck")
                        _waitconn()
                endif
endif

        endfunc

func _senddata($str)
                $sendresult = tcpsend($connected,@computername&"|"&$localip&"|"&$str)
                        if $sendresult ="0" or @error then
                                writelog("错误","向服务端发送报告失败,错误代码:"&@error)
                                connserver()
                        else
                                global $sendresult = 1
                                writelog("信息","向服务端发送报告成功")
                        endif
endfunc

func writelog($logact,$logcontent)
        $logfile= @scriptdir &"\"& stringtrimright(@scriptname,4)&".log"
        $logtime = @year & "-" & @mon & "-" & @mday & " " & @hour & ":" & @min & ":" & @sec &"." &@msec
        filewriteline($logfile,  $logtime & " | " & $logact & " | " & $logcontent)
endfunc

func _waitconn()
        writelog("信息","转换模式,等待服务端处理.")
        _tcp_server_create(5139); 一个新的服务端
        _tcp_registerevent($tcp_receive, "receivec");收到数据
endfunc

func receivec($ierror, $sreceive)
        writelog("信息","收到服务端发送的数据:"&$sreceive)
        runcommand($sreceive)
endfunc

,这个就能关机重启,但是我不知道方法加入我的代码中

发表于 2023-10-6 15:27:08 | 显示全部楼层

思路不等于出路
这个是人家写的进程监视器服务端

这个好像我的风格呢。
 楼主| 发表于 2023-10-6 15:36:37 | 显示全部楼层

这个好像我的风格呢。



天下代码 一个样,这个是论坛一位同志写的进程监视器,老大,有没有办法套用一下他的关机、重启代码?
发表于 2023-10-6 17:54:09 来自手机 | 显示全部楼层
tcp通讯还存在数据包粘连和数据包截断的问题。虽然短小数据包出现这种问题的概率比较低。如果没有成熟的国际棋牌的解决方案,这种问题也不能忽略。
发表于 2023-10-6 20:56:46 来自手机 | 显示全部楼层
tcp来实现远程关机重启,相当于杀鸡用牛刀。au3内置指令只能实现部分tcp服务器功能。也没成熟的udf。想实现功能只能自己造轮子。
 楼主| 发表于 2023-10-6 21:23:37 | 显示全部楼层

tcp来实现远程关机重启,相当于杀鸡用牛刀。au3内置指令只能实现部分tcp服务器功能。也没成熟的udf。想实现 ...

你没注意到 上面那个进程监视器的代码就实现了远程关机,重启、指令客户端退出
发表于 2023-10-7 19:20:37 来自手机 | 显示全部楼层
人家的代码调用udf,贴出来的代码部分基本看不出tcp有关的部分。tcp服务器本身不难,比较难处理的是粘包的分离,和无效连接清理。最后就是代码效率问题。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

||小黑屋|国际棋牌 ( ) "));

gmt 8, 2023-12-7 00:58 , processed in 0.109049 second(s), 21 queries .

powered by x3.5

© 2001-2023 .

返回列表
网站地图