找回密码
 加入
搜索
查看: 4113|回复: 14

AU3中如何获取指定端口数据包的IP

[复制链接]
发表于 2009-4-10 11:08:25 | 显示全部楼层 |阅读模式
其实问题是接着上次我问的有关内网和外网的通信问题
http://www.autoitx.com/forum.php ... &extra=page%3D1

经过提醒后查了资料,明白了内网IP在过NAT(连接外网的网关吧)的时候会发生IP变化

那么现在想到的一个可行办法就是如果能得到该数据包的IP报头,从其中读取出来向的IP和端口,就可以和对方进行通信了

那么有什么办法可以得到这个来向IP呢?
发表于 2009-4-10 11:16:01 | 显示全部楼层
AU3做不到抓包
发表于 2009-4-10 11:22:25 | 显示全部楼层
原帖由 78391493 于 2009-4-10 11:16 发表
AU3做不到抓包



看样有些的东西还是要用正经的语言写啊
发表于 2009-4-10 13:38:04 | 显示全部楼层
内网与外网通信,一是用网关端口重定向,即在网关上指明接收到某个端口的数据包直接转发到内网某IP的端口。二是端口反弹,即内网机器首先跟外网机器连接,在连接过程中网关将产生一个随机端口供2个机器通信,外网机器需要发送给内网机器的数据包发送到这个网关地址的这个端口就行。
 楼主| 发表于 2009-4-10 18:14:09 | 显示全部楼层
楼上说的我都知道,所以我才会想出这个办法来得到中转的端口和IP

难道AU3就完全没办法实现这个么。。。
发表于 2009-4-10 21:51:01 | 显示全部楼层
为何要关心IP,端口这些东西呢?至于网关的端口那更是完全没必要。
Windows下的网络通信只在初始化阶段才需要IP和Port,连接建立后都是Socket。发送数据就是把数据发送到Socket,接收数据则是从Socket读取。

我不清楚你要写什么程序。两台机器的直接通信必须至少一台处于公网或是设置端口转发,如果双方都是内网那就没办法了。
发表于 2009-4-10 22:03:36 | 显示全部楼层
au3的网络部分是一种典型的C/S架构。一台机器在本机建立侦听端口,另一台机器连接到此端口。双方连接建立成功,都产生了一个Socket,之后的通信就是读和写各自Socket的操作。

另外,所有正经的语言都不会考虑路由转发问题。也没有哪个程序的网络通信是用抓包来操作的。
发表于 2009-4-10 22:47:27 | 显示全部楼层
你可以搜索下udp穿透,可能对你有帮助.
TCP穿透不了的,只有UDP可以不需要网关做DSTNAT
发表于 2009-4-10 23:02:23 | 显示全部楼层
即使是UDP,如果没有位于公网的第三方协助,也是没有办法直接通信的。
楼主的需求是传送文件,并不适合使用UDP协议。
 楼主| 发表于 2009-4-11 00:32:34 | 显示全部楼层
原帖由 sensel 于 2009-4-10 22:03 发表
au3的网络部分是一种典型的C/S架构。一台机器在本机建立侦听端口,另一台机器连接到此端口。双方连接建立成功,都产生了一个Socket,之后的通信就是读和写各自Socket的操作。

另外,所有正经的语言都不会考虑路由 ...


我想理解你的意思了,也就是内网主动申请连接外网机器建立连接以后就可以开始通信了对么?

那么是否意味着UDP是无法从外网机器直接发送至内网机器的呢?
发表于 2009-4-11 00:54:27 | 显示全部楼层
无论什么协议,都无法做到直接从外网发送数据至内网机器(未在NAT服务器作端口转发/内网机器未连接到外网目标机器)。
原因很简单,大部分NAT在接收到发送至未开放端口或已开放端口但源IP非建立的IP时,为安全起见执行的操作都是直接丢弃数据包。

“内网主动申请连接外网机器建立连接以后就可以开始通信了”,是的。

[ 本帖最后由 sensel 于 2009-4-11 00:56 编辑 ]
发表于 2009-4-11 01:23:56 | 显示全部楼层
创建网络通信的程序,建议你仔细阅读帮助文件中的TCPRecv和TCPSend函数所带的例子。
你要做的是,在外网机器上建立侦听,然后等待内网机器来连接。连接建立后,需要发送文件的一方将文件用TCPSend发送到本机Socket,另一方不停地用TCPRecv读取本机Socket,如果读取内容非空则将读取数据写入文件。
如果文件较大,你还要考虑将文件分割后再传送。
还有,因为是通过公网通信,本着安全第一的原则,你还要考虑在连接建立时进行验证,比如用用户名和密码什么的。

总之,说了一大堆废话之后,其实我想说的是:很复杂的。不如建个FTP服务器,直接用FTP传文件算了。。。
 楼主| 发表于 2009-4-11 01:55:42 | 显示全部楼层
按照LS的意思我写了如下代码,请问这两段代码是否能够进行通信

server是外网机器,打开65534端口监听,当得到连接请求的时候允许并且像该socket写入"1"
;server
$g_ip="127.0.0.1"

TCPStartup()
$MainSocket=TCPListen($g_ip,65534)

While 1
        $ConnectedSocket = TCPAccept($MainSocket)
        If $ConnectedSocket >= 0 Then
                while 1
                        TCPSend($ConnectedSocket,"1")
                        Sleep(1000)
                WEnd
        EndIf
Wend
client端是无所谓内网外网,连接到上面这个拥有外网IP的机器65534端口上,并且开始接受数据并且以Msgbox的方式提示
;client
TCPStartup()

$t_ip="";上面server端IP地址
$socket=TCPConnect($t_ip,65534)
If $socket = -1 Then
        MsgBox(0,"Warning","Connect error")
EndIf
while 1
        $recv=TCPRecv($socket,50)
        If $recv<>"" Then
                MsgBox(0,"recv",$recv,500)
        EndIf
WEnd
因为找不到一个外网IP进行试验,所以请问我上面的这个构思,当server端在外网启动后,任意一台机器启动下面的client程序,都能收到server端反馈的"1"字符是么?

[ 本帖最后由 fhmily 于 2009-4-11 12:04 编辑 ]
 楼主| 发表于 2009-4-11 02:08:28 | 显示全部楼层
睡觉前再发一贴,说一件诡异的事件,发生于几个星期以前,但是今天我才觉得这件事情诡异=.=

那个时候刚开始接触autoit,非常新奇,于是就用帮助里面的UDP例子写了一个网络聊天程序。在本机上用127.0.0.1试验成功以后兴奋的发给了一个朋友(就是上个帖子里面提到的那位),结果是我能收到对方的信息而对方却接收不到我的

当时为了这个事情折腾了一个晚上也没有解决的了(能解决就怪了=.=),可是今天回想这个事情才觉得诡异,那个朋友和我都是内网用户,我那天是怎么接收到他发过来的消息的

PS:为了确认不是我梦游,看了QQ记录,截图表面确实是收到了,可惜当时一怒之下把源文件删除了,现在也无从考证到底是怎么回事了=.=
发表于 2009-4-11 20:38:51 | 显示全部楼层
小改一下,本机测试通过。一般来说,本机通过就可以了,或者你可以开个虚拟机测试一下。
至于你说的两台内网机器UDP传送成功,我注意到当时你和你朋友正在开着QQ通信,而QQ走的正是UDP协议。具体原因请阅读 http://www.ppcn.net/n1306c2.aspx “P2P之UDP穿透NAT的原理与实现”。

;server
$g_ip = @IPAddress1
$iPort = 65534

TCPStartup()
$MainSocket = TCPListen($g_ip, $iPort)

While 1
        $ConnectedSocket = TCPAccept($MainSocket)
        If $ConnectedSocket <> -1 Then
                While 1
                        TCPSend($ConnectedSocket, "1")
                        If @error Then ExitLoop
                        Sleep(1000)
                WEnd
        EndIf
WEnd


;client
$t_ip = ""   ; 上面server端IP地址
$iPort = 65534

TCPStartup()
$socket = TCPConnect($t_ip, $iPort)

If @error Then
        MsgBox(0, "Warning", "Connect error")
Else
        While 1
                $recv = TCPRecv($socket, 256)
                If @error Then ExitLoop
                If $recv <> "" Then
                        MsgBox(0, "recv", '[' & $recv & ']')
                        ExitLoop
                EndIf
        WEnd
EndIf
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-23 07:19 , Processed in 0.087111 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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