txm888 发表于 2014-7-21 09:57:52

现在新版的TCPRecv反复接收为空时,也返回错误@error = -1

本帖最后由 txm888 于 2014-7-22 10:43 编辑

现在新版的TCPRecv反复接收为空时,也返回错误@error = -1,以前版本不存在,如果是这样,要如何反复接收,且不要检测为错误呢?因为我还想用这种方式判断另一端是否在线。#include <MsgBoxConstants.au3>
监听端:
#include <MsgBoxConstants.au3>

Example()

Func Example()
    TCPStartup()
    OnAutoItExitRegister("OnAutoItExit")
    Local $sIPAddress = "127.0.0.1" ; This IP Address only works for testing on your own computer.
    Local $iPort = 65432 ; Port used for the connection.
    Local $iListenSocket = TCPListen($sIPAddress, $iPort)
    Local $iError = 0

    If @error Then
      ; Someone is probably already listening on this IP Address and Port (script already running?).
      $iError = @error
      MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Could not listen, Error code: " & $iError)
      Return False
    EndIf

    Local $iSocket = 0
    Do
      $iSocket = TCPAccept($iListenSocket)
      If @error Then
            $iError = @error
            MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Could not accept the incoming connection, Error code: " & $iError)
            Return False
      EndIf
    Until $iSocket <> -1

    While 1
        sleep(100)
    WEnd

    TCPCloseSocket($iListenSocket)
    MsgBox($MB_SYSTEMMODAL, "", "Client Connected.")
    TCPCloseSocket($iSocket)
EndFunc   ;==>Example

Func OnAutoItExit()
    TCPShutdown() ; Close the TCP service.
EndFunc   ;==>OnAutoItExit
请求端:#include <MsgBoxConstants.au3>

; I am the client, start me after the server! (Start first the TCPAccept example script).

Example()

Func Example()
    TCPStartup() ; Start the TCP service.
    OnAutoItExitRegister("OnAutoItExit")
    Local $sIPAddress = "127.0.0.1"
    Local $iPort = 65432
    Local $iSocket = TCPConnect($sIPAddress, $iPort)

    If @error Then
      Local $iError = @error
      MsgBox(BitOR($MB_SYSTEMMODAL, $MB_ICONHAND), "", "Could not connect, Error code: " & $iError)
      Return False
    Else
      MsgBox($MB_SYSTEMMODAL, "", "Connection successful")
      While 1
                $data = TCPRecv($iSocket, 1)
                If @error Then
                        Msgbox(0, "已接收" & $data & "内容", "接收错误" & @error)
                        Exit
                EndIf
      WEnd
    EndIf

    TCPCloseSocket($iSocket)
EndFunc   ;==>Example

Func OnAutoItExit()
    TCPShutdown()
EndFunc   ;==>OnAutoItExit

txm888 发表于 2014-7-21 11:10:13

你们都没遇到这问题吗?关于TCP通讯的应该有不少啊,我现在测试的是3.3.9.4及以上版本,3.3.8.1就不存在这问题

shqf 发表于 2014-7-21 11:50:54

根据3.3.9.4的示例代码,收到“空”不应为错误。看你的代码,另一端发送的是一个空格,那么本端收到一个空格,因为空格也是一个字符,与“空”不是一回事啊。
用发送一个空格表明是否在线,不好。检查客户端是否在线,较好的方式是客户端定期发送心跳包,服务端一定时间收不到心跳包就判定为离线。心跳包也是一种数据包,至少要包括消息头及结尾标志吧。$data = TCPRecv($iSocket, 1)只接收一个字符?不接收其它信息了?不现实啊。

txm888 发表于 2014-7-21 14:02:22

回复 3# shqf


    感谢,3.3.9.4是我以前初试了下,当时感觉不兼容,就没继续用,但最近看ACC的版本大家都在用,是S大发布,于是我又来测试,发现TCP反复接收为空字符时,并报error错,我知道发数据格式可以,但这种发信息的方式感觉通讯成本加大了,只想用最简单的方式判断,反复接收,只要不报错,都表示在线,如果报错,就代表断开1分钟了,版本号:3.3.12.0
地址:http://au3.cc/thread-699-1-1.html

请再帮想想还有别的办法吗?,谢谢

shqf 发表于 2014-7-21 14:19:51

本帖最后由 shqf 于 2014-7-21 14:22 编辑

楼主,你所谓 的“空字符”究竟是什么意思呢?还有什么叫反复接收?还有什么叫反复接收为空?
恕我愚昧,真的不太明白了。
还有需要搞清楚另一端定期多少时间发送?发送的究竟是什么?,发送其他字符能收到吗?

shqf 发表于 2014-7-21 14:34:52

仔细看了一下你的代码。你的代码哪来的啊?都没用上 TCPAccept(),不是个服务端,怎么会成功呢?
这根本 是一个客户端啊!只是用来发送数据的脚本啊。
建议用示例代码能成功发送和接收后再来修改逐步完善代码吧。否则你这个样子搞不去的啊!

txm888 发表于 2014-7-21 14:51:19

回复 6# shqf


    你好,代码监听端和请求端我都发到了第一楼,当请求端连接上监听端后,监听端接收了这一链接请求,而后监听端不给请求端发送任何字符,请求端却一直在接收,反复接收,可就没有东西传过来,此时请求端就提示收到的信息什么都没有,并报了个error错误,而以前的版本接不到信息,就直接为空就是了,而不会报错,因为它们俩之间并没有断开,只是监听端没有发送数据而已,对吧,所以正常来说,是不应该报错的,但3.3.12.0就报错

shqf 发表于 2014-7-21 15:57:24

本帖最后由 shqf 于 2014-7-21 16:00 编辑

一般来讲监听端是接收,请求端是发送。你现在把两个概念搞反了,所以代码也有部分搞反了。
TCPListen、TCPAccept、TCPRecv是配套使用的,用在监听端或叫服务端。TCPConnect、TCPSend是配套使用的,用在请求端或叫客户端。
你现在的两段代码中,根本没用到TCPSend!!!没有一端在发送数据,另一端接收什么呢?而且TCPRecv应用在服务端,你却用在请求端,用反了啊。
因为基础存在先天错误,所以其实没有一楼这个问题。如果一定要得到一楼这个问题的答案 ,告诉你是无解。

txm888 发表于 2014-7-21 17:10:03

回复 8# shqf


   如果按照您的分析,通信就只能单边通信了,我觉得应该是能实现我发你收,你发我收,现在的问题是我不想发任何东西,只想让它一直收,收不到为空都没关系,但不要报错,因为我也是对照以前的版本来观察的这事

ceoguang 发表于 2014-7-22 06:00:34

按一楼的代码是有问题的,跟版本没有关系
是因为监听端Accept成功后就调用了closesocket

txm888 发表于 2014-7-22 10:46:24

回复 10# ceoguang


    谢谢,代码确实有这问题,已重新编辑,结束Do循环后,加了个While循环,我这边用3.3.12.0版测试,同样报error=-1的问题,有再帮看看,谢谢!

马甲 发表于 2014-7-22 14:11:41

回复 11# txm888


    确实是版本问题,因为中途官方更新了@error的值,如果接收的数据为空,会设置@error = -1。如果要继续使用该版本的话,判断语句改为@error > 0就可以使用了。不过这样的话,如果对方没有正常关闭socket的话,也是获取不到离线状态的,这时候就必须自己想方法实现了,可以用心跳包或者其他方法。

不过最近官方又更新了,3.3.13.2 以后的版本就可以照以前的方法写了。

txm888 发表于 2014-7-22 16:35:06

回复 12# 马甲


    发现你也研究过这问题,老大,你了解的新闻很实用,好的,我很期待下一版本,感谢感谢
页: [1]
查看完整版本: 现在新版的TCPRecv反复接收为空时,也返回错误@error = -1