奇怪的C#SocketException

时间:2011-03-19 03:09:58

标签: c# .net sockets exception xna

在测试我的Client-Server程序时,我在尝试连接到不同路由器上的服务器时遇到了一个奇怪的异常:

“连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接主机无法响应而建立连接失败。”

客户端可以在本地网络中完美地连接到服务器,但是当它通过互联网时它不起作用。

我端口转发端口1250(我正在使用的端口),并使用SimplePortForwarding(http://www.simpleportforwarding.com/)我验证了端口是打开并正常工作的。

我的实现基于本教程: http://www.developerfusion.com/article/3918/socket-programming-in-c-part-1/

知道出了什么问题吗? 谢谢!

这是服务器监听方法:

    public void startListening(int port)
    {
        lock(_locker)
        {
            _listeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                // Bind socket to local endpoint, and listen for incoming connections
                IPEndPoint ipEndpoint = new IPEndPoint(IPAddress.Any, port);
                _listeningSocket.Bind(ipEndpoint);
                _listeningSocket.Listen(10);

                waitForNewClient();

                // successfully started listening
                _isListening = true;

            } catch (SocketException e)
            {
                // failed for some strange reason
                _isListening = false;
            }
        }
    }

这是客户端连接代码:

    public String connect(String ipAddress, int port)
    {
        lock(_locker)
        {
            if (!_connecting)
            {
                _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(ipAddress), port);

                try
                {
                    _socket.Connect(endpoint);
                    _connected = true;
                    waitForData();

                    _eventManager.queueEvent(new PlayerJoinedEvent(PlayerJoinedEvent.PLAYER_JOINED, name));
                } catch (SocketException e)
                {
                    // Exception is thrown HERE
                    return e.Message;
                }
            }
        }

        return "";
    }

3 个答案:

答案 0 :(得分:0)

您在服务器或客户端路由器上打开了端口1250?它需要在服务器路由器上打开。您可能需要确保服务器已连接到DMZ端口和/或在服务器路由器上启用了DMZ。

希望这有帮助。

答案 1 :(得分:0)

确保您的服务器IP地址为public,除非无法访问。

检查此link是否有私人地址空间。

答案 2 :(得分:0)

我解决了这个问题。

我使用的IP地址是我从ipconfig获得的内部IP地址,但我需要使用的IP地址是外部地址,即从http://www.whatsmyip.org/等服务获得的IP地址。

我仍然对为什么这两个数字不同感到困惑。