2011-03-19 94 views
1

在测试我的客户端 - 服务器程序,我遇到尝试连接到服务器不同的路由器上时,一个奇怪的例外:奇怪的C#SocketException

“连接尝试失败,因为连接的方没有正确后响应一段时间,或建立的连接失败,因为连接的主机未能响应。“

客户端可以在本地网络中完美地连接到服务器,但它在Internet上时不起作用。

我端口转发端口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 ""; 
    } 
+1

仅供参考,您的怪异的例外就是俗称的连接超时。 – 2011-03-19 03:12:44

+0

对不起,昨天是我第一次做任何套接字编程。 – user434565 2011-03-19 03:14:30

+0

你在连接什么IPAddress?本地LAN的IP地址通常与互联网IP地址不同。如果您对LAN和Internet使用相同的IP地址,则根据您设置的IP地址类型,只有其中一个IP地址可以工作。 – 2011-03-19 08:20:41

回答

0

请确保您的服务器IP地址是public,除非它不可达。

检查这个link为私人地址空间。

0

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

希望这会有所帮助。

0

我修复了这个问题。

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

我仍然困惑,为什么这两个数字是不同的。

+0

这正是我的回答所谈论的。 ;)您正在使用您的路由器分配的专用地址,除非客户端在同一个网络中,否则无法访问该地址。 (即在相同的路由器下)。请参阅此链接了解更多详情。 http://www.wisegeek.com/what-is-the-difference-between-public-and-private-ip-addresses.htm – young 2011-03-21 02:01:21