Private Sub Form_Load()
If Winsock1.State <> sckClosed Then
Winsock.Close
End If
Winsock1.Connect "192.168.1.11", 4000 '这样就可以。 'Winsock1.Connect "129.95.56.83", 4000 '如果改成这样测试不能通讯的
MsgBox Winsock1.LocalIP
End Sub
If Winsock1.State <> sckClosed Then
Winsock.Close
End If
Winsock1.Connect "192.168.1.11", 4000 '这样就可以。 'Winsock1.Connect "129.95.56.83", 4000 '如果改成这样测试不能通讯的
MsgBox Winsock1.LocalIP
End Sub
以下是引用别人的话...
我们假设在两个不同的局域网后面分别有2台客户机A和 B,AB所在的局域网都分别通过一个路由器接入互联网。互联网上有一台服务器S。
现在AB是无法直接和对方发送信息的,AB都不知道对方在互联网上真正的IP和端口, AB所在的局域网的路由器只允许内部向外主动发送的信息通过。对于B直接发送给A的路由器的消息,路由会认为其“不被信任”而直接丢弃。
要实现 AB直接的通讯,就必须进行以下3步:A首先连接互联网上的服务器S并发送一条消息(对于UDP这种无连接的协议其实直接初始会话发送消息即可),这样S就获取了A在互联网上的实际终端(发送消息的IP和端口号)。接着 B也进行同样的步骤,S就知道了AB在互联网上的终端(这就是“打洞”)。接着S分别告诉A和B对方客户端在互联网上的实际终端,也即S告诉A客户B的会话终端,S告诉B客户A的会话终端。这样,在AB都知道了对方的实际终端之后,就可以直接通过实际终端发送消息了(因为先前双方都向外发送过消息,路由上已经有允许数据进出的消息通道)
顺便请教wo22ni,如何有效地获取各用户的真正终端呢?