为何socket 不能连接上局域网内的计算机
各位大侠:
最近研究网络编程,遇见问题好生难受,还望大侠赐教。具体情况如下:
我现在有两台计算机,一台计算机在公司的局域网内;一台计算机通过联通3G无线上网卡上网,二者相距很远。3G上网卡需要控制一个相机进行拍照,并将拍摄的图像通过3G网络传输到另一台计算机上。局域网内的计算机已经实现端口映射,映射端口号为8888(通过在外网的计算机上,利用“telnet 325.245.14.55 8888”连接该计算机,能连接上),联通3G上网的计算机的IP也是局域网内的IP(以10.开头),我的想法是:由于在局域网内的计算机的IP以及映射的端口号都知道,因而可以在局域网内的计算机上建立服务器,在3G上网的计算机端利用已知的IP与端口对其进行连接,而后进行数据传输。但现在的问题是,虽然我能在3G计算机端用telnet连接上局域网内的服务器,但我的程序用socket连接时,却始终连接
不上,我用另外两个网上下载的程序进行测试(各含一个服务器端程序、一个客户端程序),结果也一样。在其中一个程序的服务器程序中,我在启动服务监听的时候,用8888这个端口号建立通信的时候根本无法通过,而用其它端口号则能建立监听(代码为 bSuccess = m_pCurServer->CreateSocket( m_strPort, AF_INET, SOCK_STREAM, 0);在用8888时,这个语句会出错;用较小的端口则不会)。在我自己的程序中:
m_Slisten = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (bind(m_Slisten, (LPSOCKADDR)&m_sin, sizeof(m_sin)) == SOCKET_ERROR)
{
throw("bind failed!");
}
用8888这个端口时,这里的bind就不能通过,不知道为什么。
另外:我用在网上下载的程序进行连接时,如果两个机子都在同一个局域网内,则能顺利连上;如果一个在局域网内,一个在有外网IP的计算机上,在局域网内的计算机做客服端连接有外网的计算机也能连上)。
但为什么我这里就不能连接上,非常困惑,不知道是端口号过大,或者端口映射后需要做其它什么设置,我很迷糊。请大侠赐教,谢谢!!!
[最优解释]
问题一个一个解决,不要想着一下把所有问题都解决。通过netstat命令可以看出端口占用情况
[其他解释]
估计就是端口被占用了,换一个大端口试试,比如20000以后的
[其他解释]
首先看看端口是否可用 开始-运行-cmd-netstat-aon查看端口是否被占用。
需要具有固定公网的IP,局域网内网通过路由器分出去,无法访问公网
[其他解释]
打印错误信息出来,一看就明白了,可能是端口占用
[其他解释]
或者获取错误码看看什么错误,这里我觉得应该是端口号已经被占用,不能再绑定监听!
[其他解释]
谢谢各位的帮助,首先需要确定的是8888,这个端口应该没问题吧??
[其他解释]
关键是我已经测试过了,同时帮我用IIS建立网站,这个是能访问的,这就说明端口是正常的啊!但我用socket连接却始终连接不上。我的程序是(我觉得不应该有问题啊):
m_nAddrLen = sizeof(sockaddr_in);
m_sockVersion = MAKEWORD(2, 2);
m_portSer = 8888;
m_sin.sin_port = htons(m_portSer);
m_sin.sin_family = AF_INET;
m_sin.sin_addr.S_un.S_addr = INADDR_ANY;
WSAStartup(m_sockVersion, &m_wsaData);//初始化WSADATA结构体
m_Slisten = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //初始化套接字
bind(m_Slisten, (LPSOCKADDR)&m_sin, sizeof(m_sin);
listen(m_Slisten, 5);
m_RecvState = true;
m_sClient = accept(m_Slisten, (SOCKADDR*)&m_remoteAddr, &m_nAddrLen);
[其他解释]
谢谢,我们公司专人管理端口映射的人,回头让他给再改改试试