找回密码
 加入
搜索
查看: 5633|回复: 7

[网络通信] UDP怎么实现外网与内网的通信?

  [复制链接]
发表于 2010-5-24 23:47:43 | 显示全部楼层 |阅读模式
RT,UDP通信,局域网内通信好办,广域网通信也好办,但是如果一台外网主机和一台局域网内的能上网的主机通信就不好办了,内网主机发给外网主机的数据包能收到,但是反过来就收不到数据包了,期待高手解答!
代码如下:
#Include <ACN_NET.au3>
#include <GUIConstantsEx.au3>

$my_ip=_NetworkGetInternetIP()
UDPStartup()

$GOOEY = GUICreate("aaa", 300, 355)
$edit1 = GUICtrlCreateEdit("", 10, 10, 280, 180)
$ipinput=GUICtrlCreateInput ( @IPAddress1, 75, 200, 150 , 20 )
$edit2 = GUICtrlCreateEdit("", 10, 230, 280, 80)
$send=GUICtrlCreateButton ( "发送", 110, 320 , 80 , 30 )
GUISetState()

$socket_recv=UDPBind($my_ip, 65432)
If @error Then
$socket_recv=UDPBind(@IPAddress1, 65432)
EndIf

Local $msg=""
Local $ip=""

While 1
    $msg = GUIGetMsg()

    If $msg = $GUI_EVENT_CLOSE Then Exit

    $data = UDPRecv($socket_recv,1024,1)
    If $data <> "" Then
        $data=BinaryToString ($data,4)
        If GUICtrlRead($edit1)<>"" Then
          GUICtrlSetData($edit1,GUICtrlRead($edit1)& @CRLF &GUICtrlRead ($ipinput) &" To Me::"& $data)
        Else
          GUICtrlSetData($edit1,GUICtrlRead ($ipinput) &" To Me::"& $data)
        EndIf
    EndIf

    If $msg=$send Then
       $ip=GUICtrlRead ($ipinput)
       $socket_send=UDPOpen($ip, 65432)
       UDPSend($socket_send,StringToBinary($my_ip&"-->"&GUICtrlRead($edit2),4))
       UDPCloseSocket ( $socket_send )
      If GUICtrlRead($edit1)<>"" Then
        GUICtrlSetData($edit1,GUICtrlRead($edit1) & @CRLF &"Me To "&GUICtrlRead ($ipinput)&"::"& GUICtrlRead ($edit2))
      Else
        GUICtrlSetData($edit1,"Me To "&GUICtrlRead ($ipinput)&"::"& GUICtrlRead ($edit2))
      EndIf
      GUICtrlSetData ($edit2, "" )
    EndIf
WEnd
发表于 2010-5-25 02:07:45 | 显示全部楼层
本帖最后由 l4ever 于 2010-5-25 02:08 编辑

反过来当然不行,因为没端口映射


LAN -> WAN 当然可以
WAN -> LAN 只是发到lan的外网IP上了,需在路由上映射用到的端口到LAN机器上
 楼主| 发表于 2010-5-25 08:57:26 | 显示全部楼层
#Include <ACN_NET.au3>
#include <GUIConstantsEx.au3>

$my_ip=_NetworkGetInternetIP()
UDPStartup()

$GOOEY = GUICreate("aaa", 300, 355)
$edit1 = GUICtrlCreateEdit("", 10, 10, 280, 180)
$ipinput=GUICtrlCreateInput ( "118.251.140.194", 75, 200, 100 , 20 )
$portinput=GUICtrlCreateInput ( "65432", 185, 200, 50 , 20 )
$edit2 = GUICtrlCreateEdit("", 10, 230, 280, 80)
$send=GUICtrlCreateButton ( "发送", 110, 320 , 80 , 30 )
GUISetState()

$socket_recv=UDPBind($my_ip, 65432)
If @error Then
$socket_recv=UDPBind(@IPAddress1, 65432)
EndIf

Local $msg=""
Local $ip=""

While 1
    $msg = GUIGetMsg()

    If $msg = $GUI_EVENT_CLOSE Then Exit

    $data = UDPRecv($socket_recv,1024,3)
    If $data <> "" Then
        $data[0]=BinaryToString ($data[0],4)
        If GUICtrlRead($edit1)<>"" Then
          GUICtrlSetData($edit1,GUICtrlRead($edit1)& @CRLF &$data[1]&"("&$data[2]&") To Me::"& $data[0])
        Else
          GUICtrlSetData($edit1,$data[1]&"("&$data[2]&") To Me::"& $data[0])
        EndIf
    EndIf

    If $msg=$send Then
       $ip=GUICtrlRead ($ipinput)
       $port=GUICtrlRead ($portinput)
       $socket_send=UDPOpen($ip, $port)
       UDPSend($socket_send,StringToBinary(GUICtrlRead($edit2),4))
       UDPCloseSocket ( $socket_send )
      If GUICtrlRead($edit1)<>"" Then
        GUICtrlSetData($edit1,GUICtrlRead($edit1) & @CRLF &"Me To "&GUICtrlRead ($ipinput)&"::"& GUICtrlRead ($edit2))
      Else
        GUICtrlSetData($edit1,"Me To "&GUICtrlRead ($ipinput)&"::"& GUICtrlRead ($edit2))
      EndIf
      GUICtrlSetData ($edit2, "" )
    EndIf
WEnd

改了下,还是不行,为什么呢?
测试自己电脑时,这个获取到的端口怎么都不是我打开的那个端口,而是每次都不同,是一个1K多的端口,这是什么端口?
发表于 2010-5-25 11:25:43 | 显示全部楼层
所以网络通信的还是要从基本的TCP和UDP原理学起。

内网通信外网UDP没戏。
发表于 2010-6-7 22:04:20 | 显示全部楼层
还想学习呢,先顶下把。
发表于 2010-6-8 00:14:13 | 显示全部楼层
做端口映射要在接外网的路由器里设置,这个需要你有设置路由器的权限
发表于 2010-6-8 11:41:06 | 显示全部楼层
先顶一下,
发表于 2010-6-8 11:48:00 | 显示全部楼层
还想学习呢,先顶下把。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 13:26 , Processed in 0.076056 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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