【发布时间】:2011-04-20 01:06:21
【问题描述】:
我在两台计算机之间使用 C# 运行一个简单的服务器/客户端套接字应用程序时遇到问题,我已经开始没有想法了。我在两台机器上都运行 Windows XP,并且我已经为我尝试连接的端口和 exe 添加了防火墙例外。奇怪的是,它可以完美地与在一台机器上运行的客户端和服务器一起工作。
服务器代码:
IPAddress ipAddress;
IPAddress.TryParse("127.0.0.1", out ipAddress);
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 51000);
_ListenerSocket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.IP);
try
{
_ListenerSocket.Bind(localEndPoint);
_ListenerSocket.Listen(1000);
while (_Running)
{
_ListenerSync.Reset();
_ListenerSocket.BeginAccept(new AsyncCallback(AcceptCallback), _ListenerSocket);
_ListenerSync.WaitOne();
}
_ListenerSocket.Shutdown(SocketShutdown.Both);
_ListenerSocket.Close();
}
客户代码:
tTarget = new Socket(_IP.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
tTarget.Connect(_IP, 51000);
AcceptCallback 永远不会被调用。所以有些东西在触发之前拒绝了连接。此客户端/服务器设置适用于单台计算机上的内部连接(在同一台计算机上同时运行客户端和服务器),但尝试在本地网络上将两台计算机连接在一起时会失败。
tTarget.Connect() 调用引发异常:
No connection could be made because the target machine actively refused it
我在两台机器上都安装了wireshark,以确保数据包到达,106 是客户端,101 是服务器。
262 24.724892 192.168.0.106 192.168.0.101 TCP brlp-2 > 51000 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 SACK_PERM=1
263 24.724922 192.168.0.101 192.168.0.106 TCP 51000 > brlp-2 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
270 25.144866 192.168.0.106 192.168.0.101 TCP brlp-2 > 51000 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 SACK_PERM=1
271 25.144887 192.168.0.101 192.168.0.106 TCP 51000 > brlp-2 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
288 25.647842 192.168.0.106 192.168.0.101 TCP brlp-2 > 51000 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 SACK_PERM=1
289 25.647874 192.168.0.101 192.168.0.106 TCP 51000 > brlp-2 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
注意:这是抛出异常前51000端口上的所有网络通信。
看起来没有任何东西被阻止,并且由于它可以在单台计算机上运行,我认为这可能是套接字上的一个设置,它不允许来自远程 PC 的连接。任何建议将不胜感激,谢谢。
【问题讨论】: