找回密码
 加入
搜索
查看: 4833|回复: 17

[网络通信] [已解决]关于tcpsend发送和接收的一个问题

[复制链接]
发表于 2021-8-4 18:30:32 | 显示全部楼层 |阅读模式
本帖最后由 anythinging 于 2021-8-7 12:18 编辑

各位朋友,在写客户端用tcpsend发送信息,在服务器接收时遇到一个问题:
客户端发送3个信息,服务器端接收到的都是3个信息连在一起1条信息的,请教如何能实现服务端接到到3个单独的信息?
代码如下
Func Send()        ;客户端发送
                $Text = @UserName
                TCPSend ($Socket,StringToBinary($Text,4))

                $Text = @ComputerName
                TCPSend ($Socket,StringToBinary($Text,4))

                $Text = @OSVersion
                TCPSend ($Socket,StringToBinary($Text,4))
EndFunc

Func Rev();服务端接收
        $sReceived = BinaryToString($sReceived,4)
        ConsoleWrite($sReceived)
EndFunc
已附代码在下面,求指点客户端:第一次连接发送给服务端用户名,计算机名,操作系统信息,并每5秒发送在线和开机运行时间(是个计时器,代码没写出来)
服务端:接到到信息后进行识别及进行相应操作


 楼主| 发表于 2021-8-4 22:53:47 | 显示全部楼层
;客户端
Global $Socket

TCPStartUp()

$Socket = TCPConnect('127.0.0.1','33333')

AdlibRegister ("send2",5000);每5秒发送信息(在线和开机运行时间)

Send1();初次连接发送


Func Send1()        ;初次连接发送
                $Text = @UserName
                TCPSend ($Socket,StringToBinary('x111'&$Text,4))
                $Text = @ComputerName
                TCPSend ($Socket,StringToBinary('x222'&$Text,4))
                $Text = @OSVersion
                TCPSend ($Socket,StringToBinary('x333'&$Text,4))
EndFunc

Func Send2()        ;发送在线
                $Text = "online"
                TCPSend ($Socket,StringToBinary($Text,4))
                $Text = "开始运行时间"
                TCPSend ($Socket,StringToBinary($Text,4))
EndFunc




While 1
        Sleep(5000)
WEnd

;服务端
#include <TCP.au3>

$hServer = _TCP_Server_Create('33333','127.0.0.1')
_TCP_RegisterEvent($hServer, $TCP_NEWCLIENT, "NewClient")
_TCP_RegisterEvent($hServer, $TCP_RECEIVE, "rev")


Func NewClient($hSocket, $iError)
        ConsoleWrite('有连接接入   '&$hSocket&@CRLF)
EndFunc

Func rev($hSocket, $sReceived, $iError)        ;接收客户端信息
        $sReceived = BinaryToString($sReceived,4)
        ConsoleWrite($sReceived&@CRLF)
        If StringLeft($sReceived,4) = 'x111' Then ConsoleWrite('用户名:'&StringTrimLeft($sReceived,4)&@CRLF)
        If StringLeft($sReceived,4) = 'x222' Then ConsoleWrite('计算机名:'&StringTrimLeft($sReceived,4)&@CRLF)
        If StringLeft($sReceived,4) = 'x333' Then ConsoleWrite('操作系统:'&StringTrimLeft($sReceived,4)&@CRLF)
        If $sReceived = 'online' Then ConsoleWrite('当前在线:'&$hSocket&@CRLF)

EndFunc



While 1
        Sleep(5000)
WEnd
发表于 2021-8-5 08:32:35 | 显示全部楼层
anythinging 发表于 2021-8-4 21:29
感谢回复,可能是我描述的不清楚,我整理下代码,稍后放上来
我目前解决的方式比较低端,将收到的一串信息 ...

一条消息,一条消息的,是需要每发送一次就关闭一次。

另外,你分享成3个单独信息比较麻烦,那你为什么不从数据那边入手呢,对发送的数据做下整理。
SEND(用户名|计算机名|系统版本) 不好吗?

点评

用这个方法已成功解决  发表于 2021-8-6 23:09

评分

参与人数 1金钱 +40 收起 理由
anythinging + 40 很给力!

查看全部评分

发表于 2021-8-4 20:24:44 | 显示全部楼层
你这代码,我是很没看明白。   估计你只管发送,不给关闭造成的。如上的send()没见你关闭套,所以造成的疑惑。   搜索一下我早期的东西:TCP控制台-局域网指令服务  看能否有借鉴意义。早期 对这方面有小小研究,现在没有过的了。
发表于 2021-8-4 21:28:53 | 显示全部楼层
风哥说的对,你这样感觉就是一起发送,只是代码是分开的,要么就把数据在服务端处理也可以。
 楼主| 发表于 2021-8-4 21:29:20 | 显示全部楼层
感谢回复,可能是我描述的不清楚,我整理下代码,稍后放上来
我目前解决的方式比较低端,将收到的一串信息,通过截取分离成3个单独信息,比较麻烦。同时对客户端发送时的要求也提高了很多。
 楼主| 发表于 2021-8-4 21:35:59 | 显示全部楼层
或者我这么问一下,在保持连接的情况下,使用tcpsend发送出的消息,怎样能实现一条一条的?
发表于 2021-8-5 08:35:16 | 显示全部楼层

你这服务端使用 现在au3中内置的不好吗! 还找个早期的tcp.au3干嘛?

你发送用的内置的,接收确不用。

------------------------

另外你这是收集你内网信息,为什么不用直接搞个http环境就行呀,随便搞个,客户端只需要post或get就行。免得这么麻烦。
发表于 2021-8-5 08:45:50 | 显示全部楼层
anythinging 发表于 2021-8-4 21:35
或者我这么问一下,在保持连接的情况下,使用tcpsend发送出的消息,怎样能实现一条一条的?

客户端发一次,关闭一次就行。

你有这需求,应该就是还有多个客户端发消息给你,你不好识别是不。


服务端
你TCPListen 列队,TCPAccept连接,TCPRecv接收数据,无数据或处理完数据后TCPCloseSocket关闭它就行。一直循环。

每个链接都可以取到IP来源,如果不取,你可以从发送端数据下手,带个IP过来或其它识别字符,方便你服务端识别处理。
发表于 2021-8-5 08:47:20 | 显示全部楼层
不能再说了,再说我都要二的了。

除非 我自己再做一次。我也是基础不劳,有需求时才去研究一下。
能知道的都给你说的了,对不对需要你自己去参考研究一下,我也是半吊子水。


反正收集信息,我建议就是你在内网搞个 服务器,多好,多简单。
 楼主| 发表于 2021-8-5 17:46:54 | 显示全部楼层
感谢解答!
我是参考论坛里的一个tcp.au3的例子开始学习的,那个例子有统计在线数、闲置、自动断开等功能
费了好大精力刚才了解了一点儿tcp.au3,居然还是个早期的。
 楼主| 发表于 2021-8-5 22:31:00 | 显示全部楼层
绿色风 发表于 2021-8-5 08:45
客户端发一次,关闭一次就行。

你有这需求,应该就是还有多个客户端发消息给你,你不好识别是不。

感谢指点!我刚刚用
发送端tcpsend
接收端TCPAccept,TCPCloseSocket成功实现了多个单独信息的发送与接收
但有个问题,也是刚开始想解决的问题,就是上面确实实现了多次信息的发送与接收,但每次的socket都会变,想请教是否能保持当前socket不变的前提下,达到上述效果?
发表于 2021-8-6 08:38:17 | 显示全部楼层
anythinging 发表于 2021-8-5 22:31
感谢指点!我刚刚用
发送端tcpsend
接收端TCPAccept,TCPCloseSocket成功实现了多个单独信息的发送与 ...

根据来源 来识别
 楼主| 发表于 2021-8-6 10:27:27 | 显示全部楼层
本帖最后由 anythinging 于 2021-8-6 11:03 编辑
绿色风 发表于 2021-8-6 08:38
根据来源 来识别

收到,如果必需用TCPCloseSocket关闭当前sock的情况下,我想可能要使用用户名来识别了。
但是如果不关闭的话,还没想清楚该怎么操作

发表于 2021-8-6 13:23:53 | 显示全部楼层
anythinging 发表于 2021-8-6 10:27
收到,如果必需用TCPCloseSocket关闭当前sock的情况下,我想可能要使用用户名来识别了。
但是如果不关闭 ...

你可以时刻带上用户名来识别或sock的IP



; 函数将从一个连接套接字返回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
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-26 12:09 , Processed in 0.092398 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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