我正在学习网络编程,并尝试开发一个使用MFC的CSocket类的简单套接字应用程序。并发现自己撞墙需要一些帮助。
我希望服务器端侦听某个端口,例如1001
。然后从其他计算机上,在同一个子网上,它应该成功远程登录到该端口。我的程序在localhost上正常工作,但在LAN上失败,虽然我在侦听器的防火墙上打开了该端口。
这是我的听众代码:
//CListenSocket is derived from CSocket
CListenSocket myListener;
myListener.Create(1001);
myListener.Listen();
//OnAccept()
//CConnectSocket is also derived from CSocket
CConnectSocket myConnect;
myListener.Accept(myConnect);
我使用VS2008构建了发布版本,这是配置属性的屏幕截图:
所以在这个阶段,当我运行程序时,netstat -an
显示这一行:
TCP 0.0.0.0:1001 0.0.0.0:0 LISTENING
然后在该计算机telnet 127.0.0.1 1001
上显示此行。
TCP 127.0.0.1:1001 127.0.0.1:2681 ESTABLISHED
所以我认为我的代码是正确的。之后我尝试从其他机器使用相同的子网,telnet失败:
Connecting To 192.168.2.199...Could not open connection to the host, on port 1001: Connect failed
注意:我的监听器位于192.168.2.199
,连接器位于192.168.2.3
。两个节点都可以成功ping通并相互共享文件。我还为防火墙上的程序添加了Inbound Rule
和Outbound Rule
,以下是规则的属性:
有关详细信息:在我的侦听器节点上,安装了Apache HTTP服务器,因此我将另一个节点telnet连接到端口80,并且它可以工作...
那我在哪里错过了?请帮忙,提前谢谢。
第1版: 尝试进行问题排查 所以在我把头撞到桌子上一段时间之后,我很快就决定不再使用telnet作为客户了。但是制作一个小型客户端程序来捕获错误:
//CClientSocket is derived from CSocket
CClientSocket clientSocket;
clientSocket.Create();
int iConnect = clientSocket.Connect(ipAddress,1001) //ipAddress is a variable of MFC's text box on GUI.
switch (iConnect)
{
case 0:
{
DWORD errorNumber = ::GetLastError(); //catch error code
CString s_errorNumber;
s_errorNumber.Format("%d",errorNumber); //format to CString for easy echo
MessageBox("Connection fail :"+s_errorNumber)
clientSocket.ShutDown(CAsyncSocket::both);
clientSocket.Close();
break;
case SOCKET_ERROR:
if (::GetLastError() != WSAEWOULDBLOCK)
clientSocket.ShutDown(CAsyncSocket::both);
else
clientSocket.AsyncSelect();
break;
default:
{
MessageBox("Connection Established.");
}
break;
}
错误编号为:10061
。我在MSDN上检查了此代码,它是WSAECONNREFUSED
- 拒绝连接。
现在我们知道这里的问题一定是在监听器的防火墙的某个地方......仍然把我的脑袋拉到桌面上。