endpoint = new IPEndPoint(IPAddress.Parse(this.SmsIP),this.SmsUserport);
listener=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(endpoint);
            this.SendEvent+=new SendDelegate(TcpSerUser_SendEvent);
th = new Thread (new ThreadStart(Listen)); 
th.Start();  //开始监听这段代码,绑定内网ip(192.168.1.22)就正常运行,绑定外网ip就出异常.
以前不是这样的,以前绑定内网外网都没有问题的.
用路由上网的.
请教高人.

解决方案 »

  1.   

    不好意思
    问下跟踪查看是什么意思?
    是跟代码吗?listener.Bind(endpoint);执行这句出错的
      

  2.   

    代码看来没有什么错。
    绑定的地址看看能不能在地址列表找到,如果找不到,估计会错。因为只能够绑定本机地址,你总不能绑定到一个非本机的远程地址吧?不然就乱套了。要获取地址列表,用下列代码IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
    foreach (IPAddress ipAddr in ipHostInfo.AddressList)
    {
    Console.WriteLine(ipAddr.ToString());
    }
    Console.ReadLine();
      

  3.   

    现在弄好了.
    服务器端绑定内网ip
    客户端绑外网
    不过有点奇怪,以前两端都绑外网ip,也能运行.现在不知道怎么就不行了.
    结贴吧,谢谢各位!
      

  4.   

    服务器端如果在内网,可以绑定内网IP,然后在路由做NAT出去,打开端口。
    客户端不管在内还是外,都绑定内网IP,然后让路由自动做NAT。客户端请求连接服务器,就连接到服务端NAT的端口上,然后服务器会得到客户端的NAT地址,就可以进行通信。
      

  5.   

    "客户端不管在内还是外,都绑定内网IP"//应该是绑定外网ip吧?
      

  6.   

    客户端如果是在路由器的后面,属于共享上网,你可以直接通过检查机器IP,将IP绑定就好。这个IP可能是内网,也可能是外网,这取决于客户端如何上网的。如果客户端在内网,Dns.GetHostEntry(Dns.GetHostName()).AddressList里面你就只能够看到内网的IP,没关系,直接绑定。连接服务器的时候,路由会自动给你一个NAT的端口,让你连接服务器。客户端无需知道这个端口号,在服务端可以通过检测客户端Socket的IP信息得到。流程如下客户端(内网IP 10.0.0.10) -> 请求连接服务器(233.120.75.68:48000) -> 
    路由接受连接,自动分配NAT端口(203.115.25.76:60000) -> 连接服务器 ->
    服务器路由接受请求(233.120.75.68:48000) -> 
    服务器路由根据端口映射连接服务器(192.168.0.100: 48000)  ->
    服务器接收到了客户端信息,开始通讯除了服务器需要端口映射,客户端基本上不需要做调整。