xigua0325 发表于 2008-9-18 12:35:49

[AU3]关于tcp命令的问题

按AUTOIT帮助里的例子,可以得到的效果是

client      server
connet -> listen ->accept
sand   ->Recv
以上是例子是参考的例子的

然后就引出一个问题.
当client正在与server通信的时候,client2再与server连接,虽然是连接上了.可是server取不到client2的信息
谁可以告诉我怎么往后该怎么写?

[ 本帖最后由 xigua0325 于 2008-9-18 13:52 编辑 ]

l4ever 发表于 2008-9-18 12:46:05

server在while之前用TCPListen 监听端口
之后在While
退出的时候再关闭监听看看

xigua0325 发表于 2008-9-18 12:58:17

其实我一直就有个想法.AU3能不能做到两个线程以上呢

比如说上面的例子..当server正在listen的时候,server的窗口是关不了的,因为它在do...until

单线程就是说,当它与cilent通信的时候,listen就用不到.当在listen的时候,它也通信不了

不知道我的感觉有没有错.

hhy02111 发表于 2008-11-19 21:39:59

为什么发送中文的时候有错误?

sanhen 发表于 2008-11-19 23:27:37

中文发送,转换一下字符再发送就是了。

TCP问题,用UDF试下。

akmm88 发表于 2008-11-21 19:05:46

Do
        $accept = TCPAccept($listen)
       
Until $accept <> -1
问题就在这里,只要有连接$accept就<>-1,该循环就退出了。
au3没有提供多线程函数,你可以试试使用timer这个控件,论坛里应该有人介绍过。
While 1
   $accept = TCPAccept($listen)
   if $accept <>-1 then
      在这里启动timer控件来对该连接操作,为了能控制所有连接。这里还应该用个数组变量来
   保存这个$accept句柄
   endif
WEnd

duxuetao1201 发表于 2009-4-20 14:34:32

回复 1# xigua0325 的帖子

才看到这个帖子

发一个我的想法


While 1
        Do
                $ConnectedSocket = TCPAccept($MainSocket)
        Until $ConnectedSocket <> -1

        ; 获取客户端连接的IP地址
        $szIP_Accepted = SocketToIP($ConnectedSocket)

        ; 尝试接收 100 个字节的数据
        ;----------------------------------------------------------------
        $recv = TCPRecv($ConnectedSocket, 100)

        ; If the receive failed with @error then the socket has disconnected
        ;----------------------------------------------------------------
      If @error Then
         ConsoleWrite("接收信息错误 !!!" & @CRLF)
      else
      ; 开始处理收到的数据
      ConsoleWrite("收到来自IP:" & $szIP_Accepted & "的消息: " & $recv & @CRLF)
      ; 结束处理收到的数据
    endif
WEnd


其中下边的语句
ConsoleWrite("收到来自IP:" & $szIP_Accepted & "的消息: " & $recv & @CRLF)
用于显示收到的消息,不要用msgbox函数,因为消息函数会导致脚本的暂停执行,从而导致无法
及时的接收到其他客户端发来的消息
其实,最重要的一点就是尽量缩短处理收到数据的时间,尽快让程序返回到Do....Until语句去接收
其他客户端的消息。

大家有什么好方法记得共享啊 qq:37361025

[ 本帖最后由 duxuetao1201 于 2009-4-20 14:38 编辑 ]

sensel 发表于 2009-4-20 18:01:45

在一个循环中处理TCPAccept和TCPRecv。TCPAccept有效则增加数组新单元,TCPRecv错误则删除数组相应单元。不断循环,直至用菜单项退出。

sensel 发表于 2009-4-20 18:29:39

大概例子如下:

Global $aConnected =

; 建立TrayItem,启动TCP,开始侦听端口。略

While 1
        Switch TrayGetMsg()
                Case $hExitItem
                        ExitLoop
                Case Else
                        Accept()
                        Recv()
        EndSwitch
WEnd

; 退出处理

Exit

Func Accept()
        $ConnectedSocket = TCPAccept($MainSocket)
        If $ConnectedSocket <> -1 Then
                _ArrayAdd($aConnected, $ConnectedSocket)
                $aConnected += 1
        EndIf
        Return
EndFunc

Func Recv()
        $i = 1
        While $i <= UBound($aConnected) - 1
                $sRecv = TCPRecv($aConnected[$i], 256)
                If @error Then   ; 客户端已关闭
                        _ArrayDelete($aConnected, $i)
                        $aConnected -= 1
                ElseIf $sRecv = "" Then   ; 客户端未发送数据,继续处理下一客户端
                        $i += 1
                Else
                        ; 接收数据处理。完成后TCPCloseSocket,然后删除数组单元并将 $aConnected -= 1

                EndIf
        WEnd
        Return
EndFunc

zpl13 发表于 2009-12-16 21:22:13

学习中,看来高手多多的呀

ollydbg 发表于 2009-12-19 13:41:27

学习了,俺网络类的知识有待学习!
页: [1]
查看完整版本: [AU3]关于tcp命令的问题