找回密码
 加入
搜索
查看: 5388|回复: 5

[网络通信] tcp如何同时建立多连接[已解决]

  [复制链接]
发表于 2011-5-6 12:58:57 | 显示全部楼层 |阅读模式
本帖最后由 love5173 于 2011-5-6 20:52 编辑

如题,tcp如何同时监听多个连接,这些连接不定时的断开跟连接
这个是仿照帮助里的例子写的单连接的,即便是单连接,我断开再重新连的时候也不能再连了
#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)
Opt("GUIOnEventMode",1)
Example()

Func Example()
    Local $szIPADDRESS = @IPAddress1
    Local $nPORT = 33891
    Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted
    Local $msg, $recv

    ; 启动 TCP 服务
    ;==============================================
    TCPStartup()

    ; 建立监听套接字 "SOCKET".
    ;   使用您的IP地址和端口 33891.
    ;==============================================
    $MainSocket = TCPListen($szIPADDRESS, $nPORT)

    ; 如果套接字创建失败, 则退出.
    If $MainSocket = -1 Then Exit


    ; 创建消息 GUI
    ;==============================================
    $GOOEY = GUICreate("GM报警服务器(本机IP: " & $szIPADDRESS & ")", 360, 200)
    $edit = GUICtrlCreateEdit("", 10, 10, 280, 180)
    GUISetState()
        GUISetOnEvent($GUI_EVENT_CLOSE, "gui")
            $ConnectedSocket = -1
           Do
        $ConnectedSocket = TCPAccept($MainSocket)
    Until $ConnectedSocket <> -1
    $szIP_Accepted = SocketToIP($ConnectedSocket)
    While 1
        $recv = TCPRecv($ConnectedSocket, 2048)
        ;If @error Then ExitLoop
        If $recv <> "" Then 
                GUICtrlSetData($edit, _
                $szIP_Accepted & " > " & $recv & @CRLF & GUICtrlRead($edit))
                                For  $i=0 To 2
                                        _TalkOBJ($szIP_Accepted&"G M 报警 请及时处理")
                                Next
                        EndIf
                        ContinueLoop
                
            WEnd


    If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)

    TCPShutdown()
EndFunc   ;==>Example

; 函数将从一个连接套接字返回IP地址
;----------------------------------------------------------------------
Func SocketToIP($SHOCKET)
    Local $sockaddr, $aRet
    
    $sockaddr = DllStructCreate("short;ushort;uint;char[8]")

    $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
            "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
    If Not @error And $aRet[0] = 0 Then
        $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
        If Not @error Then $aRet = $aRet[0]
    Else
        $aRet = 0
    EndIf

    $sockaddr = 0

    Return $aRet
EndFunc   ;==>SocketToIP
Func gui()
    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            Exit
            EndSwitch
                EndFunc   ;==>gui
                

Func _TalkOBJ($s_text)
  Local $o_speech = ObjCreate("SAPI.SpVoice")
  $o_speech.Speak($s_text)
  $o_speech = ""
EndFunc
发表于 2011-5-6 14:00:00 | 显示全部楼层
看我的这个帖子。。。是多连接的 试试吧

http://www.autoitx.com/thread-20154-1-1.html
 楼主| 发表于 2011-5-6 19:09:24 | 显示全部楼层
回复 2# yeqing880
谢谢你的代码,通过借鉴实现了我的功能,但是毕竟有些不懂的地方,还要加强学习!
发表于 2014-12-24 19:33:54 | 显示全部楼层
本帖最后由 love5173 于 2011-5-6 20:52 编辑

如题,tcp如何同时监听多个连接,这些连接不定时的断开跟连接
这个是仿照帮助里的例子写的单连接的,即便是单连接,我断开再重新连的时候也不能再连了
发表于 2019-2-20 11:31:59 | 显示全部楼层
楼主请看下,这是什么意思 ?

"C:\Users\Administrator\Desktop\server3.au3"(55,18) : 错误: zxsq(): 未定义函数.
Dim $lianjie[zxsq-
~~~~~~~~~~~~~~~~~^
"C:\Users\Administrator\Desktop\server3.au3"(55,23) : 错误: anti(): 未定义函数.
Dim $lianjie[zxsq-anti-
~~~~~~~~~~~~~~~~~~~~~~^
"C:\Users\Administrator\Desktop\server3.au3"(55,30) : 错误: bbcode(): 未定义函数.
Dim $lianjie[zxsq-anti-bbcode-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\Users\Administrator\Desktop\server3.au3 - 3 条错误, 0 条警告
发表于 2019-2-20 11:36:02 | 显示全部楼层
C端也有提示
"C:\Users\Administrator\Desktop\cliend3.au3"(67,98) : 错误: zxsq(): 未定义函数.
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 12:42 , Processed in 0.084751 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表