爱体育

 
 加入
12
返回列表
楼主: wllx

如何 用tcp实现远程关机、重启-爱体育

[复制链接]
发表于 2023-10-7 21:09:45 | 显示全部楼层
以前写的 tcp服务端,你可以参考一下。
  1. #region ;**** directives created by autoit3wrapper_gui ****
  2. #autoit3wrapper_icon=                                                                                                 ;程序图标
  3. #autoit3wrapper_usex64=n                                                                                         ;是否编译为64位程序(y/n)
  4. #autoit3wrapper_outfile=                                                                                         ;输出的exe名称
  5. #autoit3wrapper_outfile_x64=                                                                                 ;64位输出的exe名称
  6. #autoit3wrapper_useupx=n                                                                                         ;是否使用upx压缩(y/n) 注:开启压缩极易引起误报问题
  7. #autoit3wrapper_res_comment=http://www.autoitscript.com/autoit3/         ;程序注释
  8. #autoit3wrapper_res_description=autoit team                                        ;文件说明
  9. #autoit3wrapper_res_fileversion=1.0.0.40
  10. #autoit3wrapper_res_field=productname|autoit v3                                     ;产品名称
  11. #autoit3wrapper_res_productversion=1.0                                                                 ;产品版本
  12. #autoit3wrapper_res_legal爱体育 copyright=©1999-2021 autoit team                          ;爱体育的版权
  13. #autoit3wrapper_res_language=2052                                                                         ;语言, 英语=2057/中文=2052
  14. #autoit3wrapper_res_field=originalfilename|autoit.exe                    ;原始文件名
  15. #autoit3wrapper_res_field=internalname|autoit_exe                               ;内部名称
  16. #autoit3wrapper_res_fileversion_autoincrement=y                                                 ;自动更新版本 y/n/p=自动/不自动/询问
  17. #autoit3wrapper_res_requestedexecutionlevel=asinvoker                                 ;请求权限: none/asinvoker/highestavailable/requireadministrator
  18. #autoit3wrapper_run_tidy=n                                                                                         ;编译前自动整理脚本(y/n)
  19. #autoit3wrapper_res_hidpi=p                                                                                         ;支持dpi感知
  20. #au3stripper_parameters=/sf=1 /sv=1
  21. #endregion ;**** directives created by autoit3wrapper_gui ****

  22. #cs ____________________________________

  23.         欢迎使用 autoit v3 中文版 !
  24.         au3版本:        3.3.14.5
  25.         脚本作者:
  26.         脚本功能:
  27.         更新日志:
  28.         爱体育的联系方式:

  29. #ce _______________脚本开始_________________
  30. #include
  31. #include
  32. #include
  33. #include
  34. #include
  35. #include
  36. #include
  37. opt("mustdeclarevars", 1)
  38. opt("guioneventmode", 1)
  39. opt("guicloseonesc", 0)
  40. global const $fd_read = 1
  41. global const $fd_write = 2
  42. global const $fd_accept = 8
  43. global const $fd_connect = 16
  44. global const $fd_close = 32
  45. global const $fd_setsize = 32 ;定义监听客户端数量
  46. global const $tagfd_set = "uint fd_count;uint fd_array[" & $fd_setsize & "]"
  47. global $hdll_ws2_32 = dllopen("ws2_32.dll")
  48. global const $fd_max_events = 10
  49. global $netevent = dllstructcreate("long lnetworkevents;int ierrorcode[" & $fd_max_events & "];")
  50. global $udp_event = dllstructcreate("handle event;")
  51. global $udp_socket
  52. global $udp_port = 6800 ;定义监听端口
  53. global $tcp_max = 2
  54. global $tcp_port[$tcp_max] = [20001, 20002] ;定义监听端口
  55. global $tcp_socket[$tcp_max]
  56. global $tcp_event = dllstructcreate("handle event[" & $tcp_max & "];")
  57. global $client_socket = dllstructcreate($tagfd_set)
  58. global $test, $hgui, $idedit, $idlistview
  59. global $sendgui, $button1, $input, $num, $data
  60. global $fd_array[$fd_setsize][10]
  61. opt("guiresizemode", 1)
  62. global $hidpi
  63. if @compiled then
  64.         if _isprocessdpiaware() then
  65.                 $hidpi = _getdpi()
  66.         else
  67.                 $hidpi = 1
  68.         endif
  69. else
  70.         _setprocessdpiaware()
  71.         $hidpi = _getdpi()
  72. endif

  73. tcpstartup()
  74. $udp_socket = udpopen("255.255.255.255", $udp_port, 1)
  75. udpsend($udp_socket, binary("0x01000000a00f00000000000000000000")) ;发送广播消息,查询是否存在服务。
  76. $data = udprecv($udp_socket, 4096, 1) ;接收消息,耗时 50毫秒。
  77. udpclosesocket($udp_socket)

  78. if $data <> "" then
  79.         exit msgbox(262144 65536 64, "警告", "发现内网服务端:" & binarytostring($data) & " 退出程序.")
  80. endif

  81. creategui()
  82. #region 创建监听端口
  83. for $i = 0 to $tcp_max - 1
  84.         $tcp_socket[$i] = tcplisten("0.0.0.0", $tcp_port[$i], 1024)
  85.         if @error then exit msgbox(262144 65536 64, "tcp端口冲突", "tcp端口被占用:" & $tcp_port[$i])
  86.         _echo($idedit, "监听tcp端口:" & $tcp_port[$i])
  87.         $tcp_event.event($i 1) = _winapi_createevent(0, true, false) ;创建事件对象, 为无信号,手动重置
  88.         _sockeventselect($tcp_socket[$i], $tcp_event.event($i 1), $fd_accept) ;设置到事件模式
  89. next

  90. $udp_socket = udpbind("0.0.0.0", $udp_port)
  91. if @error then exit msgbox(262144 65536 64, "udp端口冲突", "udp端口被占用:" & $udp_port)
  92. _echo($idedit, "监听udp端口:" & $udp_port)
  93. $udp_event.event(1) = _winapi_createevent(0, true, false) ;创建事件对象, 为无信号,手动重置
  94. _sockeventselect($udp_socket[1], $udp_event.event(1), $fd_read) ;设置到事件模式
  95. #endregion 创建监听端口
  96. _echo($idedit, "启动完成。")
  97. onautoitexitregister("_exit")
  98. adlibregister("_timeout", 1000 * 60) ;活动连接心跳检测

  99. while 1
  100.         _tcp_event($client_socket)
  101.         _udp_event()
  102.         _client_event($client_socket)
  103.         sleep(5)
  104. wend

  105. func _data_out($isocket, $idate)
  106.         if binarylen($idate) < 20 then
  107.                 _tcpsend($isocket, "x")
  108.                 ;_echo($idedit, "收到心跳包:" & $idate)
  109.         else
  110.                 _echo($idedit, "收到数据:" & $idate)
  111.         endif
  112. endfunc   ;==>_data_out

  113. func _udp_event() ;处理udp网路事件
  114.         local $iobjects, $data, $aret
  115.         local $datelen = 4096
  116.         $iobjects = _winapi_waitformultipleobjects(1, $udp_event, false, 0) ;检测信号状态,等待5毫秒
  117.         switch $iobjects
  118.                 case 0
  119.                         _winapi_resetevent($udp_event.event($iobjects 1)) ;设置指定事件对象为无信号状态
  120.                         $aret = dllcall("ws2_32.dll", "int", "ioctlsocket", "uint", $udp_socket[1], "long", 0x4004667f, "ulong*", 0) ;查询接收缓冲区数据长度
  121.                         if $aret[0] = 0 then $datelen = $aret[3]
  122.                         $data = udprecv($udp_socket, $datelen, 3)
  123.                         if not @error then
  124.                                 if string($data[0]) == "0x01000000a00f00000000000000000000" then
  125.                                         $udp_socket[2] = $data[1]
  126.                                         $udp_socket[3] = $data[2]
  127.                                         udpsend($udp_socket, @ipaddress1 & ";" & $tcp_port[0] & ";" & $tcp_port[1])
  128.                                 endif
  129.                         endif
  130.                 case -1 ;检测信号状态失败
  131.         endswitch
  132. endfunc   ;==>_udp_event

  133. func _tcp_event(byref $tfd_set) ;处理tcp接入请求事件
  134.         local $iobjects, $isocket, $newip, $ilistitem, $index
  135.         $iobjects = _winapi_waitformultipleobjects($tcp_max, $tcp_event, false, 0) ;检测信号状态,等待5毫秒
  136.         switch $iobjects
  137.                 case 0 to $tcp_max - 1
  138.                         ;_winapi_resetevent($tcp_event.event($iobjects 1)) ;设置指定事件对象为无信号状态
  139.                         ;//添加的代码
  140.                         if _wsaenumnetworkevents($tcp_socket[$iobjects], $tcp_event.event($iobjects 1)) then ;择网络事件
  141.                                 if bitand($netevent.lnetworkevents(1), $fd_accept) then
  142.                                         if $netevent.ierrorcode(3) = 0 then
  143.                                                 $isocket = tcpaccept($tcp_socket[$iobjects])
  144.                                                 if $isocket <> -1 then
  145.                                                         $newip = _sockettoip($isocket)
  146.                                                         if $tfd_set.fd_count(1) >= $fd_setsize then
  147.                                                                 _echo($idedit, "!超出最大连接数:" & $fd_setsize & " 断开新连接")
  148.                                                                 tcpclosesocket($isocket)
  149.                                                         else
  150.                                                                 _fd_set($isocket, $tfd_set)
  151.                                                                 $index = _array_set($isocket, $fd_array)
  152.                                                                 $fd_array[$index][2] = guictrlcreatelistviewitem($newip[0], $idlistview)
  153.                                                                 $fd_array[$index][3] = $newip[0]
  154.                                                                 $fd_array[$index][4] = timerinit()
  155.                                                                 _echo($idedit, "新连接,来自ip:" & $newip[0] & " 源端口:" & $newip[1] & " 目的端口:" & $newip[3] & " 连接数:" & $tfd_set.fd_count(1))
  156.                                                         endif
  157.                                                 endif
  158.                                         else
  159.                                                 consolewrite("wsaenumnetworkevents failed with error code:" & $netevent.ierrorcode(3))
  160.                                         endif
  161.                                 endif
  162.                         endif
  163.                         ;//添加的代码
  164.                 case -1 ;检测信号状态失败
  165.         endswitch
  166. endfunc   ;==>_tcp_event

  167. func _timeout()
  168.         local $i
  169.         for $i = $fd_setsize - 1 to 0 step -1
  170.                 if $fd_array[$i][4] == "" then continueloop
  171.                 if timerdiff($fd_array[$i][4]) > 1000 * 10 then ;活动连接无心跳10秒,关闭连接
  172.                         guictrldelete($fd_array[$i][2])
  173.                         tcpclosesocket($fd_array[$i][1])
  174.                         _echo($idedit, "连接超时,来自ip:" & $fd_array[$i][3])
  175.                         _fd_clr($fd_array[$i][1], $client_socket)
  176.                         _array_clr($fd_array[$i][1], $fd_array)
  177.                 endif
  178.         next
  179. endfunc   ;==>_timeout

  180. func _tcprecv($isocket, $idatalen)
  181.         local $datelen
  182.         local $index = _array_isset($isocket, $fd_array)
  183.         if $index = -1 then return
  184.         $fd_array[$index][4] = timerinit() ;写入时间戳
  185.         local $idata = tcprecv($isocket, $idatalen, 1)
  186.         if @error then return seterror(@error, @extended, "") ;错误处理 待完善
  187.         if isbinary($fd_array[$index][5]) then ;检查缓存
  188.                 $fd_array[$index][5] = binary($fd_array[$index][5] $idata)
  189.         else
  190.                 $fd_array[$index][5] = $idata
  191.         endif
  192.         while 1
  193.                 if binarylen($fd_array[$index][5]) < 4 then exitloop
  194.                 $datelen = int(binarymid($fd_array[$index][5], 1, 4))
  195.                 if binarylen($fd_array[$index][5]) < $datelen 4 then
  196.                         exitloop
  197.                 elseif binarylen($fd_array[$index][5]) = $datelen 4 then
  198.                         _data_out($isocket, binarymid($fd_array[$index][5], 5))
  199.                         $fd_array[$index][5] = ""
  200.                         exitloop
  201.                 endif
  202.                 _data_out($isocket, binarymid($fd_array[$index][5], 5, $datelen))
  203.                 $fd_array[$index][5] = binarymid($fd_array[$index][5], $datelen 5)
  204.         wend
  205. endfunc   ;==>_tcprecv

  206. func _tcpsend($isocket, $ddata)
  207.         if $ddata == "" then return
  208.         if not isbinary($ddata) then $ddata = stringtobinary($ddata)
  209.         local $datalen = binarylen($ddata)
  210.         local $byte = binary(binary(ptr($datalen)) $ddata)
  211.         local $iret = tcpsend($isocket, $byte)
  212.         if @error then return seterror(@error, 0, 0)
  213.         return $iret
  214. endfunc   ;==>_tcpsend

  215. func _echo($hid, $stext = "")
  216.         if not stringisascii($stext) then $stext = string($stext)
  217.         local $logtime = @year & "-" & @mon & "-" & @mday & " " & @hour & ":" & @min & ":" & @sec & " " & $stext & @crlf
  218.         local $hwnd = guictrlgethandle($hid)
  219.         local $len = stringlen($logtime)
  220.         local $text = $logtime & guictrlread($hid)
  221.         if _guictrledit_getlinecount($hwnd) > 300 then
  222.                 $len = _guictrledit_lineindex($hwnd, 299)
  223.                 $text = stringleft($text, $len)
  224.         endif
  225.         guictrlsetdata($hid, $text)
  226. endfunc   ;==>_echo

  227. func creategui()
  228.         local $width = 880, $height = 680, $idcontextmenu
  229.         $hgui = guicreate("广播转发 - 支持" & $fd_setsize & "接入", $width, $height 48, -1, -1) ;创建窗口
  230.         guisetonevent($gui_event_close, "_exit")
  231.         guictrlcreategroup("客户端列表", 5, 10, $width - 10, 500)
  232.         $idlistview = guictrlcreatelistview("编号|", 10, 25, $width - 20, 480, $lvs_showselalways, $lvs_ex_fullrowselect $lvs_ex_gridlines $lvs_ex_doublebuffer) ;,$lvs_sortdescending)
  233.         _guictrllistview_setcolumnwidth($idlistview, 0, $lvscw_autosize_useheader)
  234.         guictrlcreategroup("消息日志", 5, 520, $width - 10, 166)
  235.         $idedit = guictrlcreateedit("", 15, 540, $width - 30, 136, 0x50210804, $ws_ex_staticedge)
  236.         $idcontextmenu = guictrlcreatecontextmenu($idlistview)
  237.         ;创建菜单“所有客户机”主控件-全部
  238.         guictrlcreatemenuitem("关闭连接", $idcontextmenu)
  239.         guictrlsetonevent(-1, "_selected")
  240.         guictrlcreatemenuitem("发送消息", $idcontextmenu)
  241.         guictrlsetonevent(-1, "_selected_send")
  242.         guisetstate(@sw_show)
  243. endfunc   ;==>creategui

  244. func _client_event(byref $tfd_set) ;处理客户端的网路事件
  245.         local $isocket, $idata, $newip, $aret, $index, $datelen
  246.         local $count = $tfd_set.fd_count(1)
  247.         if $count < 1 then return
  248.         local $fd_socket = dllstructcreate($tagfd_set)
  249.         local $tfd_set_dat = dllstructcreate("byte[" & $count * 4 4 & "];", dllstructgetptr($tfd_set))
  250.         local $fd_socket_dat = dllstructcreate("byte[" & $count * 4 4 & "];", dllstructgetptr($fd_socket))
  251.         dllstructsetdata($fd_socket_dat, 1, dllstructgetdata($tfd_set_dat, 1)) ;创建结构体副本
  252.         if _select($fd_socket) then ;查询是否有网络事件
  253.                 for $i = 0 to $fd_socket.fd_count(1) - 1
  254.                         $isocket = $fd_socket.fd_array($i 1)
  255.                         if _fd_isset($isocket, $fd_socket) then ;检查套接字是否存在
  256.                                 $newip = _sockettoip($isocket) ;查询套接字的源地址-目标地址
  257.                                 local $datelen = 4096
  258.                                 $aret = dllcall("ws2_32.dll", "int", "ioctlsocket", "uint", $isocket, "long", 0x4004667f, "ulong*", 0) ;查询套接字接收缓冲区中的数据长度
  259.                                 if $aret[0] = 0 then
  260.                                         if $aret[3] > 0 then
  261.                                                 _tcprecv($isocket, $aret[3])
  262.                                         else
  263.                                                 tcpclosesocket($isocket)
  264.                                                 _fd_clr($isocket, $tfd_set)
  265.                                                 $index = _array_isset($isocket, $fd_array) ;查询套接字在数组中的位置
  266.                                                 if not @error then
  267.                                                         guictrldelete($fd_array[$index][2])
  268.                                                         _array_clr($isocket, $fd_array) ;清理数组
  269.                                                 endif
  270.                                                 _echo($idedit, "断开连接,来自ip:" & $newip[0] & " 源端口:" & $newip[1] & " 目的端口:" & $newip[3])
  271.                                         endif
  272.                                 else
  273.                                         _tcprecv($isocket, 4096)
  274.                                 endif
  275.                         endif
  276.                 next
  277.         endif
  278. endfunc   ;==>_client_event

  279. func _select(byref $tfd_set)
  280.         local $timeval = dllstructcreate("int tv_sec;int tv_usec")
  281.         local $result = dllcall("ws2_32.dll", "int", "select", "int", null, "struct*", $tfd_set, "ptr", 0, "ptr", 0, "struct*", $timeval)
  282.         if $result[0] <= 0 then return false
  283.         return true
  284. endfunc   ;==>_select

  285. func _array_set($isocket, byref $tarray_set)
  286.         if not isarray($tarray_set) then return seterror(2, false, false)
  287.         if $tarray_set[0][0] = "" then $tarray_set[0][0] = 0
  288.         local $rows = ubound($tarray_set)
  289.         local $icount = $tarray_set[0][0]
  290.         for $i = 0 to $icount - 1
  291.                 if $tarray_set[$i][1] = $isocket then
  292.                         exitloop
  293.                 endif
  294.         next
  295.         if $i = $icount then
  296.                 if $icount < $rows then
  297.                         $tarray_set[$i][1] = $isocket
  298.                         $tarray_set[0][0] = $icount 1
  299.                 endif
  300.         endif
  301.         return $tarray_set[0][0] - 1
  302. endfunc   ;==>_array_set

  303. func _array_clr($isocket, byref $tarray_set)
  304.         local $columns = ubound($tarray_set, 2)
  305.         local $icount = $tarray_set[0][0]
  306.         for $i = 0 to $icount - 1
  307.                 if $tarray_set[$i][1] = $isocket then
  308.                         while ($i < $icount - 1)
  309.                                 for $s = 1 to $columns - 1
  310.                                         $tarray_set[$i][$s] = $tarray_set[$i 1][$s]
  311.                                 next
  312.                                 $i = 1
  313.                         wend
  314.                         for $s = 1 to $columns - 1
  315.                                 $tarray_set[$i][$s] = null
  316.                         next
  317.                         $tarray_set[0][0] = $icount - 1
  318.                         exitloop
  319.                 endif
  320.         next
  321. endfunc   ;==>_array_clr

  322. func _array_isset($isocket, byref $tarray_set)
  323.         if not isarray($tarray_set) then return seterror(2, false, -1)
  324.         if $tarray_set[0][0] = "" then $tarray_set[0][0] = 0
  325.         local $ret
  326.         local $columns = ubound($tarray_set, 2)
  327.         local $icount = $tarray_set[0][0]
  328.         for $i = 0 to $icount - 1
  329.                 if $tarray_set[$i][1] = $isocket then
  330.                         $ret = $i
  331.                         exitloop
  332.                 endif
  333.         next
  334.         if $ret == "" then return seterror(2, false, -1)
  335.         return $ret
  336. endfunc   ;==>_array_isset

  337. func _fd_set($isocket, byref $tfd_set)
  338.         local $icount = dllstructgetdata($tfd_set, "fd_count")
  339.         for $i = 0 to $icount - 1
  340.                 if dllstructgetdata($tfd_set, "fd_array", $i 1) = $isocket then
  341.                         exitloop
  342.                 endif
  343.         next
  344.         if $i = $icount then
  345.                 if $icount < $fd_setsize then
  346.                         dllstructsetdata($tfd_set, "fd_array", $isocket, $i 1)
  347.                         dllstructsetdata($tfd_set, "fd_count", $icount 1)
  348.                 endif
  349.         endif
  350. endfunc   ;==>_fd_set

  351. func _fd_clr($isocket, byref $tfd_set)
  352.         local $icount = dllstructgetdata($tfd_set, "fd_count")
  353.         for $i = 0 to $icount - 1
  354.                 if dllstructgetdata($tfd_set, "fd_array", $i 1) = $isocket then
  355.                         while ($i < $icount - 1)
  356.                                 dllstructsetdata($tfd_set, "fd_array", dllstructgetdata($tfd_set, "fd_array", $i 2), $i 1)
  357.                                 $i = 1
  358.                         wend
  359.                         dllstructsetdata($tfd_set, "fd_array", 0, $i 1)
  360.                         dllstructsetdata($tfd_set, "fd_count", $icount - 1)
  361.                         exitloop
  362.                 endif
  363.         next
  364. endfunc   ;==>_fd_clr

  365. func _fd_isset($isocket, byref $tfd_set)
  366.         local $aret = dllcall($hdll_ws2_32, "int", "__wsafdisset", "uint", $isocket, "struct*", $tfd_set)
  367.         return $aret[0]
  368. endfunc   ;==>_fd_isset

  369. func _wsaenumnetworkevents($hsocket, $hwnd)
  370.         local $iret = dllcall($hdll_ws2_32, "int", "wsaenumnetworkevents", "uint", $hsocket, "hwnd", $hwnd, "struct*", $netevent)
  371.         if @error then return seterror(1, @error, false)
  372.         if $iret[0] <> 0 then
  373.                 $iret = dllcall($hdll_ws2_32, "dword", "wsagetlasterror")
  374.                 return seterror(2, $iret[0], false)
  375.         endif
  376.         return true
  377. endfunc   ;==>_wsaenumnetworkevents

  378. func _sockeventselect($hsocket, $hwnd, $ievent = 0)
  379.         local $iret = dllcall($hdll_ws2_32, "int", "wsaeventselect", "uint", $hsocket, "hwnd", $hwnd, "int", $ievent)
  380.         if @error then return seterror(1, @error, false)
  381.         if $iret[0] <> 0 then
  382.                 return seterror(2, _wsagetlasterror(), false)
  383.         endif
  384.         return true
  385. endfunc   ;==>_sockeventselect

  386. func _wsagetlasterror()
  387.         local $iret = dllcall($hdll_ws2_32, "int", "wsagetlasterror")
  388.         if @error then
  389.                 setextended(1)
  390.                 return 0
  391.         endif
  392.         return $iret[0]
  393. endfunc   ;==>_wsagetlasterror

  394. func _sockettoip($hsocket)
  395.         local $sockaddr, $aret, $aarray[4], $error
  396.         $error = false
  397.         $sockaddr = dllstructcreate("short;ushort;uint;char[8]")
  398.         $aret = dllcall($hdll_ws2_32, "int", "getpeername", "int", $hsocket, _
  399.                         "struct*", $sockaddr, "int*", dllstructgetsize($sockaddr))
  400.         if @error or $aret[0] <> 0 then
  401.                 $error = true
  402.         else
  403.                 $aret = dllcall($hdll_ws2_32, "str", "inet_ntoa", "int", dllstructgetdata($sockaddr, 3))
  404.                 if not @error then $aarray[0] = $aret[0]
  405.                 $aret = dllcall($hdll_ws2_32, "ushort", "ntohs", "ushort", dllstructgetdata($sockaddr, 2))
  406.                 if not @error then $aarray[1] = $aret[0]
  407.         endif

  408.         $aret = dllcall($hdll_ws2_32, "int", "getsockname", "int", $hsocket, _
  409.                         "struct*", $sockaddr, "int*", dllstructgetsize($sockaddr))
  410.         if @error or $aret[0] <> 0 then
  411.                 $error = true
  412.         else
  413.                 $aret = dllcall($hdll_ws2_32, "str", "inet_ntoa", "int", dllstructgetdata($sockaddr, 3))
  414.                 if not @error then $aarray[2] = $aret[0]
  415.                 $aret = dllcall($hdll_ws2_32, "ushort", "ntohs", "ushort", dllstructgetdata($sockaddr, 2))
  416.                 if not @error then $aarray[3] = $aret[0]
  417.         endif
  418.         $sockaddr = 0
  419.         return seterror($error, false, $aarray)
  420. endfunc   ;==>_sockettoip

  421. func _selected()
  422.         local $column, $num, $isocket
  423.         $column = _guictrllistview_getselectedcount($idlistview)
  424.         if $column <> 1 then return
  425.         $num = _guictrllistview_getselectedindices($idlistview, false)
  426.         _echo($idedit, "关闭连接" & $fd_array[$num][3])
  427.         $isocket = $fd_array[$num][1]
  428.         tcpclosesocket($isocket)
  429.         guictrldelete($fd_array[$num][2])
  430.         _fd_clr($isocket, $client_socket)
  431.         _array_clr($isocket, $fd_array)
  432. endfunc   ;==>_selected

  433. func _selected_send()
  434.         local $column, $num
  435.         local $ahotkey[1][2]
  436.         $column = _guictrllistview_getselectedcount($idlistview)
  437.         if $column <> 1 then return
  438.         $num = _guictrllistview_getselectedindices($idlistview, false)
  439.         $sendgui = guicreate("发送数据窗口", 600, 160, -1, -1, default, default, $hgui)
  440.         guisetonevent($gui_event_close, "close_gui")
  441.         $button1 = guictrlcreatebutton("发送", 260, 112, 85, 25)
  442.         guictrlsetonevent($button1, "_button")
  443.         $input = guictrlcreateinput("", 32, 48, 520, 32)
  444.         $ahotkey[0][0] = "{enter}"
  445.         $ahotkey[0][1] = $button1
  446.         guisetaccelerators($ahotkey, $sendgui)
  447.         guisetstate(@sw_show, $sendgui)
  448.         controlfocus($sendgui, "", $input)
  449. endfunc   ;==>_selected_send

  450. func _button()
  451.         local $column, $isocket, $idata, $num
  452.         $column = _guictrllistview_getselectedcount($idlistview)
  453.         if $column <> 1 then return
  454.         $num = _guictrllistview_getselectedindices($idlistview, false)
  455.         $idata = guictrlread($input)
  456.         $isocket = $fd_array[$num][1]
  457.         if $idata <> "" and $isocket <> "" then
  458.                 _echo($idedit, "发送消息" & $idata)
  459.                 _tcpsend($isocket, $idata)
  460.         endif
  461. endfunc   ;==>_button

  462. func close_gui()
  463.         guisetaccelerators(0, $sendgui)
  464.         guidelete($sendgui)
  465. endfunc   ;==>close_gui

  466. func _exit()
  467.         for $i = 0 to $tcp_max - 1
  468.                 tcpclosesocket($tcp_socket[$i])
  469.         next
  470.         for $i = 0 to $fd_setsize - 1
  471.                 if $fd_array[$i][1] <> "" then tcpclosesocket($fd_array[$i][1])
  472.         next
  473.         udpclosesocket($udp_socket)
  474.         dllclose($hdll_ws2_32)
  475.         tcpshutdown()
  476.         exit
  477. endfunc   ;==>_exit

  478. #region dpi函数
  479. func _setprocessdpiaware()
  480.         local $aret
  481.         if @osbuild < 6000 then return ;判断系统版本 windows vista
  482.         if @osbuild < 9600 then ;判断系统版本  win8.1(9600)
  483.                 $aret = dllcall("user32.dll", "bool", "isprocessdpiaware") ;检查进程是否支持dpi感知
  484.                 return $aret[0]
  485.                 if $aret[0] = false then
  486.                         $aret = dllcall('user32.dll', 'bool', 'setprocessdpiaware') ;设置:系统dpi感知
  487.                         if @error then return seterror(@error, 0, false)
  488.                         return
  489.                 endif
  490.         else
  491.                 $aret = dllcall("shcore.dll", "bool", "getprocessdpiawareness", "hwnd", 0, "int*", 0) ;检查进程是否支持dpi感知
  492.                 if @error then return seterror(@error, 0, false)
  493.                 if $aret[2] <> 2 then ;0不支持dpi感知 1,系统dpi感知  2,监视器dpi感知
  494.                         $aret = dllcall("shcore.dll", "bool", "setprocessdpiawareness", "int", 2) ;设置:监视器dpi感知
  495.                         if @error then return seterror(@error, 0, false)
  496.                         return
  497.                 endif
  498.         endif
  499. endfunc   ;==>_setprocessdpiaware

  500. func _getdpi()
  501.         local $idpi
  502.         if @osbuild < 6000 then return 1 ;判断系统版本 windows vista
  503.         if @osbuild < 9600 then ;判断系统版本  win8.1(9600)
  504.                 $idpi = regread("hkcu\control panel\desktop\windowmetrics", "applieddpi")
  505.         else
  506.                 local $hwnd = _winapi_monitorfromwindow(_winapi_getdesktopwindow())
  507.                 local $aret = dllcall("shcore.dll", "bool", "getdpiformonitor", "handle", $hwnd, "int", 0, "int*", 0, "int*", 0)
  508.                 if @error then return seterror(@error, 0, false)
  509.                 $idpi = $aret[3]
  510.         endif
  511.         if $idpi < 96 or $idpi > 480 then $idpi = 96
  512.         return $idpi / 96
  513. endfunc   ;==>_getdpi

  514. func _isprocessdpiaware()
  515.         local $aret, $adpi = 0
  516.         if @osbuild < 6000 then return false ;判断系统版本 windows vista
  517.         if @osbuild < 9600 then ;判断系统版本  win8.1(9600)
  518.                 $aret = dllcall("user32.dll", "bool", "isprocessdpiaware") ;检查进程是否支持dpi感知
  519.                 if @error then return seterror(@error, 0, false)
  520.                 $adpi = $aret[0]
  521.         else
  522.                 $aret = dllcall("shcore.dll", "bool", "getprocessdpiawareness", "hwnd", 0, "int*", 0) ;检查进程是否支持dpi感知
  523.                 if @error then return seterror(@error, 0, false)
  524.                 $adpi = $aret[2]
  525.         endif
  526.         return $adpi
  527. endfunc   ;==>_isprocessdpiaware
  528. #endregion dpi函数
复制代码
 楼主| 发表于 2023-10-7 22:15:22 | 显示全部楼层

以前写的 tcp服务端,你可以参考一下。

难道我要重写一个应对你这个服务端的客户端。老大,请将你的客户端代码一并发出,特别谢谢你
发表于 2023-10-7 22:30:43 | 显示全部楼层

难道我要重写一个应对你这个服务端的客户端。老大,请将你的客户端代码一并发出,特别谢谢你

问题不在tcp呀。在于,【服】与【端】。

看你自己逻辑与想法吧。

 楼主| 发表于 2023-10-7 23:39:18 | 显示全部楼层

问题不在tcp呀。在于,【服】与【端】。

看你自己逻辑与想法吧。

老大,我真的想不出来,你能帮帮我吗?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

||小黑屋|爱体育 ( ) "));

gmt 8, 2023-12-7 00:59 , processed in 0.083899 second(s), 15 queries .

powered by x3.5

© 2001-2023 .

返回列表
网站地图