用WinSock编程,能否局域网内PC的端口影射到路由器上 用WinSock编程,能否局域网内PC的端口影射到路由器上如果用WinSock编一个实时的点对点通讯程序,服务器端在局域网内(使用了路由器),可有办法让客房端与服务器端连接起来? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在你的Form_load里加入sck.RemoteHost = IPsck.RemotePort = Port就可以了。其中sck是你的WinSock,IP是IP(呵呵),Port是端口号。IP转换是路由器的事,路由器不管端口。你能ping通服务器就可以了。在服务器端写个服务程序不就成了。 //用WinSock编程,能否局域网内PC的端口影射到路由器上这个只能在路由器上设置 客户端不能实现//服务器端在局域网内(使用了路由器),可有办法让客房端与服务器端连接起来?在路由器上设置一下 端口影射到路由器上 就可以了 这就是NAT转换的问题,到目前都还一直没有比较好的直接内网到内网的P2P的方案,问题的关键在于IPV4的IP不够用,还有就是NAT无法得知外网向内网访问里映射到那台机(端口),腾讯的QQ不也是要架设一个IP中转服务器才能工作吗?这样的话,IP中转服务器要有一个静态IP,费用会很高外网表示有公网IP的PC内网表示通过网关服务器上网的PC外网访问外网 Pass内网访问外网 Pass外网访问内网 Error内网访问内网 Error内网=>静态IP<=内网 这种就是QQ的方式网上有一篇文章,还有一个C#的例子,据说通过在UDP协议方式下打一个洞,可以实现外网访问内网,不过,我Debug没有Pass UDP 如果网关没关UDP 那就可以用UDP ,因为UDP,不用,连接,你的端口梆定之后,你向外,发人信息出去,你就可以得到一个映射端口。我网的程序只要知道你这个,映射端口就可以向这个端口发信息,你也就能收到。QQ不也就是这样。QQ客户端,主动登陆到服务器,就会留下,这个映射端口,服务器会把这个端口告诉你的好友你的好友,就向这个端口了消息,你就可以收到了。这样,服务器就轻松多了。如果,UDP被封了,那也就没戏。 以下图为例: Server S (219.237.60.1) | +----------------------+----------------------+ | |NAT A (外网IP:202.187.45.3) NAT B (外网IP:187.34.1.56) | (内网IP:192.168.0.1) | (内网IP:192.168.0.1) | |Client A (192.168.0.20:4000) Client B (192.168.0.10:40000) 首先,Client A登录服务器,NAT A为这次的Session分配了一个端口60000,那么Server S收到的Client A的地址是202.187.45.3:60000,这就是Client A的外网地址了。同样,Client B登录Server S,NAT B给此次Session分配的端口是40000,那么Server S收到的B的地址是187.34.1.56:40000。 此时,Client A与Client B都可以与Server S通信了。如果Client A此时想直接发送信息给Client B,那么他可以从Server S那儿获得B的公网地址187.34.1.56:40000,是不是Client A向这个地址发送信息Client B就能收到了呢?答案是不行,因为如果这样发送信息,NAT B会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数NAT都会执行丢弃动作)。现在我们需要的是在NAT B上打一个方向为202.187.45.3(即Client A的外网地址)的洞,那么Client A发送到187.34.1.56:40000的信息,Client B就能收到了。这个打洞命令由谁来发呢,呵呵,当然是Server S。 总结一下这个过程:如果Client A想向Client B发送信息,那么Client A发送命令给Server S,请求Server S命令Client B向Client A方向打洞,然后Client A就可以通过Client B的外网地址与Client B通信了。 楼上的,你说的方法那还不是要用到一个IP中转服务器我就是说的这样的方法呀,QQ不就是这么干的吗?不过,如果为了实再P2P要架IP中转服务器,恐怕大多数以开发小型绿色软件的程序员都承受不起这费用吧 //用WinSock编程,能否局域网内PC的端口影射到路由器上其实有的路由器本身就有这个功能,我知道你的意思,因为现在的p2p都是必须在网上有一个固定ip如果没有的话,定会有问题,可以有2个方案解决1。可以用路由器本身的功能把自己映射上去2,使用(花生壳),或者(科迈)这种动态域名解析,在网上申请1个免费的2级域名和动态域名,通过adsl上网,这样客户端winsock.RemoteHost 就可以写成1个域名,然后dns会给你解析成你的动态域名,也可以解决没有固定ip的问题(推荐)我是推荐第2种,主要是省钱,我就是通过这种方法解决的 如下图: +----------------------+----------------------+ | |NAT A (外网IP:202.187.45.3) NAT B (外网IP:187.34.1.56) | (内网IP:192.168.0.1) | (内网IP:192.168.0.1) | |Server (192.168.0.20:4000) Client (192.168.0.10:40000) 可有办法让Client直接与Server进行通讯?(不用设置路由器,即:用代码解决端口映射) winsock0.RemoteHost ="www.163.com"这样写你还不明白啊,只要叫客户端的winsock0.RemoteHost 指定1个域名域名是不变得,但是榜定域名的ip可以变化的代码我不能给你,因为是公司开发的产品,我只能给你讲原理 暂时来说,除非是uPnp!没别的办法能在不调路由的情况下让两个内网之间不需要中转互联!也就是说,一定要NAPT(端口影射)了!一但影射之后,你的计算机的某个端口就对外开放啦,也就相等于是一台外网主机了!也不一定需要一个具有公网IP的主机作中转,内网主机通过端口影射也一样能当中转! 有个源码,说可以端口映射,我无法测试,不知道是否能行?源码下载地址:http://www.21code.com/codebase/?pos=down&id=1993我读了读代码,感觉是行不能的。各位大侠,帮我看一看,是否能行?如果能行,能给我解释一下吗? 如果在程序中使用runas命令运行指定程序? 所谓的VB7 VB8和VISUAL BASIC。NET是什么关系呢? winsock的GetData是不是只能接受4k的数据?怪事!!! 局域网内文件复制问题 VB2010 LED控件 怎样删除文件指定行的内容 简单任务:运行浏览器并打开指定的地址? VB的两个小函数? 急!! 那里有卖比较好用的加密狗的?硬件加密, 如何在程序中判断一个Access数据库中有几张表? 请问:用VB可以编写访问My Network places(我的网络)里面的网络共享硬盘里面的文件夹么?如果可以,如何实现呢?在线等!急
sck.RemoteHost = IP
sck.RemotePort = Port
就可以了。
其中sck是你的WinSock,IP是IP(呵呵),Port是端口号。
IP转换是路由器的事,路由器不管端口。
你能ping通服务器就可以了。
在服务器端写个服务程序不就成了。
这个只能在路由器上设置 客户端不能实现//服务器端在局域网内(使用了路由器),可有办法让客房端与服务器端连接起来?在路由器上设置一下 端口影射到路由器上 就可以了
内网表示通过网关服务器上网的PC
外网访问外网 Pass
内网访问外网 Pass
外网访问内网 Error
内网访问内网 Error内网=>静态IP<=内网 这种就是QQ的方式网上有一篇文章,还有一个C#的例子,据说通过在UDP协议方式下打一个洞,可以实现外网访问内网,不过,我Debug没有Pass
QQ客户端,主动登陆到服务器,就会留下,这个映射端口,服务器会把这个端口告诉你的好友
你的好友,就向这个端口了消息,你就可以收到了。这样,服务器就轻松多了。
如果,UDP被封了,那也就没戏。
Server S (219.237.60.1)
|
+----------------------+----------------------+
| |
NAT A (外网IP:202.187.45.3) NAT B (外网IP:187.34.1.56)
| (内网IP:192.168.0.1) | (内网IP:192.168.0.1)
| |
Client A (192.168.0.20:4000) Client B (192.168.0.10:40000)
首先,Client A登录服务器,NAT A为这次的Session分配了一个端口60000,那么Server S收到的Client A的地址是202.187.45.3:60000,这就是Client A的外网地址了。同样,Client B登录Server S,NAT B给此次Session分配的端口是40000,那么Server S收到的B的地址是187.34.1.56:40000。
此时,Client A与Client B都可以与Server S通信了。如果Client A此时想直接发送信息给Client B,那么他可以从Server S那儿获得B的公网地址187.34.1.56:40000,是不是Client A向这个地址发送信息Client B就能收到了呢?答案是不行,因为如果这样发送信息,NAT B会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数NAT都会执行丢弃动作)。现在我们需要的是在NAT B上打一个方向为202.187.45.3(即Client A的外网地址)的洞,那么Client A发送到187.34.1.56:40000的信息,Client B就能收到了。这个打洞命令由谁来发呢,呵呵,当然是Server S。
总结一下这个过程:如果Client A想向Client B发送信息,那么Client A发送命令给Server S,请求Server S命令Client B向Client A方向打洞,然后Client A就可以通过Client B的外网地址与Client B通信了。
其实有的路由器本身就有这个功能,我知道你的意思,因为现在的p2p都是必须在网上有一个固定ip如果没有的话,定会有问题,可以有2个方案解决
1。可以用路由器本身的功能把自己映射上去
2,使用(花生壳),或者(科迈)这种动态域名解析,在网上申请1个免费的2级域名和动态域名,通过adsl上网,这样客户端winsock.RemoteHost 就可以写成1个域名,然后dns会给你解析成你的动态域名,也可以解决没有固定ip的问题(推荐)
我是推荐第2种,主要是省钱,我就是通过这种方法解决的
+----------------------+----------------------+
| |
NAT A (外网IP:202.187.45.3) NAT B (外网IP:187.34.1.56)
| (内网IP:192.168.0.1) | (内网IP:192.168.0.1)
| |
Server (192.168.0.20:4000) Client (192.168.0.10:40000)
可有办法让Client直接与Server进行通讯?(不用设置路由器,即:用代码解决端口映射)
这样写你还不明白啊,只要叫客户端的winsock0.RemoteHost 指定1个域名
域名是不变得,但是榜定域名的ip可以变化的
代码我不能给你,因为是公司开发的产品,我只能给你讲原理
也不一定需要一个具有公网IP的主机作中转,内网主机通过端口影射也一样能当中转!
http://www.21code.com/codebase/?pos=down&id=1993
我读了读代码,感觉是行不能的。各位大侠,帮我看一看,是否能行?
如果能行,能给我解释一下吗?