用WinSock编程,能否局域网内PC的端口影射到路由器上
如果用WinSock编一个实时的点对点通讯程序,服务器端在局域网内(使用了路由器),可有办法让客房端与服务器端连接起来?

解决方案 »

  1.   

    在你的Form_load里加入
    sck.RemoteHost = IP
    sck.RemotePort = Port
    就可以了。
    其中sck是你的WinSock,IP是IP(呵呵),Port是端口号。
    IP转换是路由器的事,路由器不管端口。
    你能ping通服务器就可以了。
    在服务器端写个服务程序不就成了。
      

  2.   

    //用WinSock编程,能否局域网内PC的端口影射到路由器上
    这个只能在路由器上设置 客户端不能实现//服务器端在局域网内(使用了路由器),可有办法让客房端与服务器端连接起来?在路由器上设置一下 端口影射到路由器上 就可以了
      

  3.   

    这就是NAT转换的问题,到目前都还一直没有比较好的直接内网到内网的P2P的方案,问题的关键在于IPV4的IP不够用,还有就是NAT无法得知外网向内网访问里映射到那台机(端口),腾讯的QQ不也是要架设一个IP中转服务器才能工作吗?这样的话,IP中转服务器要有一个静态IP,费用会很高外网表示有公网IP的PC
    内网表示通过网关服务器上网的PC
    外网访问外网  Pass
    内网访问外网  Pass
    外网访问内网  Error
    内网访问内网  Error内网=>静态IP<=内网  这种就是QQ的方式网上有一篇文章,还有一个C#的例子,据说通过在UDP协议方式下打一个洞,可以实现外网访问内网,不过,我Debug没有Pass
      

  4.   

    UDP 如果网关没关UDP 那就可以用UDP ,因为UDP,不用,连接,你的端口梆定之后,你向外,发人信息出去,你就可以得到一个映射端口。我网的程序只要知道你这个,映射端口就可以向这个端口发信息,你也就能收到。QQ不也就是这样。
    QQ客户端,主动登陆到服务器,就会留下,这个映射端口,服务器会把这个端口告诉你的好友
    你的好友,就向这个端口了消息,你就可以收到了。这样,服务器就轻松多了。
    如果,UDP被封了,那也就没戏。
      

  5.   

    以下图为例:                                                                      
                   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通信了。
      

  6.   

    楼上的,你说的方法那还不是要用到一个IP中转服务器我就是说的这样的方法呀,QQ不就是这么干的吗?不过,如果为了实再P2P要架IP中转服务器,恐怕大多数以开发小型绿色软件的程序员都承受不起这费用吧
      

  7.   

    //用WinSock编程,能否局域网内PC的端口影射到路由器上
    其实有的路由器本身就有这个功能,我知道你的意思,因为现在的p2p都是必须在网上有一个固定ip如果没有的话,定会有问题,可以有2个方案解决
    1。可以用路由器本身的功能把自己映射上去
    2,使用(花生壳),或者(科迈)这种动态域名解析,在网上申请1个免费的2级域名和动态域名,通过adsl上网,这样客户端winsock.RemoteHost 就可以写成1个域名,然后dns会给你解析成你的动态域名,也可以解决没有固定ip的问题(推荐)
    我是推荐第2种,主要是省钱,我就是通过这种方法解决的
      

  8.   

    如下图:
       +----------------------+----------------------+
       |                                             |
    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进行通讯?(不用设置路由器,即:用代码解决端口映射)
      

  9.   

    winsock0.RemoteHost ="www.163.com"
    这样写你还不明白啊,只要叫客户端的winsock0.RemoteHost 指定1个域名
    域名是不变得,但是榜定域名的ip可以变化的
    代码我不能给你,因为是公司开发的产品,我只能给你讲原理
      

  10.   

    暂时来说,除非是uPnp!没别的办法能在不调路由的情况下让两个内网之间不需要中转互联!也就是说,一定要NAPT(端口影射)了!一但影射之后,你的计算机的某个端口就对外开放啦,也就相等于是一台外网主机了!
    也不一定需要一个具有公网IP的主机作中转,内网主机通过端口影射也一样能当中转!
      

  11.   

    有个源码,说可以端口映射,我无法测试,不知道是否能行?源码下载地址:
    http://www.21code.com/codebase/?pos=down&id=1993
    我读了读代码,感觉是行不能的。各位大侠,帮我看一看,是否能行?
    如果能行,能给我解释一下吗?