现在新版的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 你们都没遇到这问题吗?关于TCP通讯的应该有不少啊,我现在测试的是3.3.9.4及以上版本,3.3.8.1就不存在这问题 根据3.3.9.4的示例代码,收到“空”不应为错误。看你的代码,另一端发送的是一个空格,那么本端收到一个空格,因为空格也是一个字符,与“空”不是一回事啊。
用发送一个空格表明是否在线,不好。检查客户端是否在线,较好的方式是客户端定期发送心跳包,服务端一定时间收不到心跳包就判定为离线。心跳包也是一种数据包,至少要包括消息头及结尾标志吧。$data = TCPRecv($iSocket, 1)只接收一个字符?不接收其它信息了?不现实啊。 回复 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:22 编辑
楼主,你所谓 的“空字符”究竟是什么意思呢?还有什么叫反复接收?还有什么叫反复接收为空?
恕我愚昧,真的不太明白了。
还有需要搞清楚另一端定期多少时间发送?发送的究竟是什么?,发送其他字符能收到吗? 仔细看了一下你的代码。你的代码哪来的啊?都没用上 TCPAccept(),不是个服务端,怎么会成功呢?
这根本 是一个客户端啊!只是用来发送数据的脚本啊。
建议用示例代码能成功发送和接收后再来修改逐步完善代码吧。否则你这个样子搞不去的啊! 回复 6# shqf
你好,代码监听端和请求端我都发到了第一楼,当请求端连接上监听端后,监听端接收了这一链接请求,而后监听端不给请求端发送任何字符,请求端却一直在接收,反复接收,可就没有东西传过来,此时请求端就提示收到的信息什么都没有,并报了个error错误,而以前的版本接不到信息,就直接为空就是了,而不会报错,因为它们俩之间并没有断开,只是监听端没有发送数据而已,对吧,所以正常来说,是不应该报错的,但3.3.12.0就报错 本帖最后由 shqf 于 2014-7-21 16:00 编辑
一般来讲监听端是接收,请求端是发送。你现在把两个概念搞反了,所以代码也有部分搞反了。
TCPListen、TCPAccept、TCPRecv是配套使用的,用在监听端或叫服务端。TCPConnect、TCPSend是配套使用的,用在请求端或叫客户端。
你现在的两段代码中,根本没用到TCPSend!!!没有一端在发送数据,另一端接收什么呢?而且TCPRecv应用在服务端,你却用在请求端,用反了啊。
因为基础存在先天错误,所以其实没有一楼这个问题。如果一定要得到一楼这个问题的答案 ,告诉你是无解。 回复 8# shqf
如果按照您的分析,通信就只能单边通信了,我觉得应该是能实现我发你收,你发我收,现在的问题是我不想发任何东西,只想让它一直收,收不到为空都没关系,但不要报错,因为我也是对照以前的版本来观察的这事 按一楼的代码是有问题的,跟版本没有关系
是因为监听端Accept成功后就调用了closesocket 回复 10# ceoguang
谢谢,代码确实有这问题,已重新编辑,结束Do循环后,加了个While循环,我这边用3.3.12.0版测试,同样报error=-1的问题,有再帮看看,谢谢! 回复 11# txm888
确实是版本问题,因为中途官方更新了@error的值,如果接收的数据为空,会设置@error = -1。如果要继续使用该版本的话,判断语句改为@error > 0就可以使用了。不过这样的话,如果对方没有正常关闭socket的话,也是获取不到离线状态的,这时候就必须自己想方法实现了,可以用心跳包或者其他方法。
不过最近官方又更新了,3.3.13.2 以后的版本就可以照以前的方法写了。 回复 12# 马甲
发现你也研究过这问题,老大,你了解的新闻很实用,好的,我很期待下一版本,感谢感谢
页:
[1]