无法在PC之间连接套接字

时间:2011-04-19 16:37:45

标签: c# sockets

我遇到了在两台计算机之间使用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的连接。非常感谢任何建议,谢谢。

2 个答案:

答案 0 :(得分:3)

使用服务器计算机的IP地址,而不是localhost地址127.0.0.1。

答案 1 :(得分:3)

将其绑定到地址0.0.0.0。这意味着“所有本地地址,无论它们是什么”。

对本地地址进行硬编码是个坏主意。使其可配置更好,但只有在您希望明确允许侦听某些本地地址而不是其他地址时才需要。对于企业级服务器软件,这有时是一项要求(多宿主服务器方案等)。