如何将内部网UDP端口映射到公共网上

Neptune2002 2004-08-04 05:21:15
我知道要让一台内网IP的机子能过代理服务器与公网连接,但公网连系内网机子时必须通过内网机子给代理服务器映射的端口才能反馈得回来。
我想知道如果才能实现映射端口呢

希望能人志士帮帮我,十分感谢!!!!最好能提供较详细资料。
...全文
1081 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
princesd 2004-08-06
  • 打赏
  • 举报
回复
不好意思,没写好就发了。你的S_A和S_B之间的联系是通过公网对吧?如果是,那你不管是从S_A还是S_B出来的数据别人看到的都是它的代理服务器的地址,而不是本身内部局域网中的地址。端口也在服务器上映射端口的端口。这就是“只需要往对方的internet(即网关) ip地址和端口发送即可”

但真的要实现还是最好用api函数来写socket程序,用控件做通的可能性很小很小。

有些问题可以共同讨论:leo.liu@163.com
princesd 2004-08-06
  • 打赏
  • 举报
回复
呵呵,好的我给你讲讲。说实话你说得这个问题很多人都遇到过,包括我。这里就是要求你的udp不能使用控件来做而要用tcpi
cjf0426 2004-08-05
  • 打赏
  • 举报
回复
princesd(中原)
你好
你说的情况好象和我的实验情况有所不同
实验情况如下
有三台机器,有一台拥有公网的IP作为服务器S,其他两台分别位于两个不同局域网内部,通过代理服务器S_A和S_B上网与S取得了通讯
之间用UDP连接
A从S取得了B的IP和端口(S取到的实际是S_B的IP和B在S_B上的映射端口),然后A向取得的IP和端口发信息,结果B并没收到
和你这句“只需要往对方的internet(即网关) ip地址和端口发送即可”有出入
请你能说明白一些好吗?
princesd 2004-08-05
  • 打赏
  • 举报
回复
我知道你的想法,我以前也想做个像QQ一样的东东.

以下的一些资料你可以看看,很有帮助:

必须客户端主动连接到服务器端后才行像qq
如果是通过squid代理服务器(linux下的,大都是用这个)上网,那么可以在请求头
中得到这些变量的值(用有php的服务器试试访问这个内容的页面:<? phpinfo(); ?>,
如:
HTTP_VIA = "1.1 count:3128 (Squid/2.3.STABLE1)" (代理服务器名称)
HTTP_X_FORWARDED_FOR = "10.0.1.111" (局域网真实IP)
用php的话访问 $HTTP_VIA 和 $HTTP_X_FORWARDED_FOR 全局变量就可以得到

实际上对qq之类的软件,是不需要知道这个的,只需要往对方的internet(即网关)
ip地址和端口发送即可,这两个东西在与服务器建立连接后服务器都可以获取,最后
会由网关转发到局域网内的,你不需要考虑这个,想知道怎么回事可以看看NAT原理.
从研究ms win2k server的路由服务的nat信息知道的。
如局域网192.168.1.1通过网关202.98.1.1链接到internet机器61.168.1.1:8000端口
连接后192.168.1.1是用的3987端口,这个192.168.1.1:3987就被映射到网关的
202.98.1.1:5678端口,61.168.1.1发送信息到192.168.1.1就只需要发送到
202.98.1.1:5678,网关会自动把它转发给192.168.1.1,当然它首先要记录本机的
端口与那台机器哪个端口对应。就是说这种ip共享的原理是用一个ip的多个端口来
映射很多ip(局域网)的端口,如192.168.1.1:4000被映射到202.98.1.1:8765,
192.168.1.2:4000被映射到202.98.1.1:8764。

所以服务器不需要知道局域网内的ip,也无法知道,除非网关或局域网微机主动
把这个信息发送给服务器,上面我说的squid代理服务器就会这么做。

如果两个局域网内的机器要通信,那就无法直接通信了,因为不能先知道对方的
internet ip(网关)和端口,只有先都链接到服务器,服务器保存这个信息并把
它发给双方,即需要通过中间牵线。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧