当通讯的两台主机处于同一局域网或者都处于公网的情况下,其中一台主机的C++ socket代码如下,ip直接填写对方的ip就好了。但是现在两台主机处于不同的局域网中,所以其中一台电脑进行端口映射,映射后的ip地址为180.160.71.130:3389; 如果用这个ip直接替换下面的ip是不行的,那么正确的应该怎样写呢?
SOCKADDR_IN local;
local.sin_addr.S_un.S_addr = inet_addr("192.168.1.199");
local.sin_family = AF_INET;
local.sin_port = htons(27015);
if (connect(sockClient, (SOCKADDR*)&local, len) == INVALID_SOCKET)
{
printf("connect error/n");
Sleep(10080);
return 0;
}
应该是SOCKADDR_IN local;
local.sin_addr.S_un.S_addr = inet_addr("180.160.71.130");
local.sin_family = AF_INET;
local.sin_port = htons(3389);
if (connect(sockClient, (SOCKADDR*)&local, len) == INVALID_SOCKET)
{
printf("connect error/n");
Sleep(10080);
return 0;
}
ip和端口都需要改
这个问题好像我回答过,你把我的回答找出来看下。
运营商会封3389端口,因为这个端口是windows远程桌面用的。
这不是程序的问题,是网络端口映射的问题。要访问另一个局域网,需要在路由器中通过虚拟服务器管理进行端口的映射。
外网端口和内网的端口可以不一致。例如,内网的SQLSERVER端口是1433,外网可以设置为1533.你需要访问1533端口。
首先题主用的是TCP/IP协议,
那么TCP/IP必然有一端为服务器端接收连接,一端为客户端向服务器端请求连接。
那么需要做的事情只是一点,让客户端看到服务器端。由于服务器端隐藏在局域网内部,客户端无法直接访问服务器。
那么我们可以通过路由器做端口映射,把服务器端所监听的端口,映射到路由器WAN口的一个端口。
然后我们判断客户端是否可以访问到路由器WAN口IP地址,如果可以访问,客户端所要建立连接的ip和端口分别是路由器WAN口ip地址和端口映射之后的端口。
如果不能直接访问,可以选择继续向上级路由进行端口映射。最多映射到广域网就肯定可以访问。
因为广域网的ip是唯一的,一个ip便对应一个子网或者一台计算机。广域网ip是全球任何一台联网计算机都可以访问的,