【问题标题】:Trouble connecting sockets between PCs在 PC 之间连接套接字时出现问题
【发布时间】: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 的连接。任何建议将不胜感激,谢谢。

【问题讨论】:

    标签: c# sockets


    【解决方案1】:

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

    硬编码本地地址是一个坏主意。使其可配置更好,但仅当您想明确允许侦听某些本地地址而不是其他地址时才有必要。对于企业级服务器软件,这有时是一项要求(多宿主服务器场景等)。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        • 2017-04-15
        • 1970-01-01
        • 1970-01-01
        • 2015-07-17
        • 2019-10-21
        相关资源
        最近更新 更多