当前位置:编程学习 > C#/ASP.NET >>

一个网络程序,在局域网调试没有问题,把服务器端移到英特网(外网)上,运行客户端时出现"远程主机强迫关闭了一个现有的连接"错误!请高手进,在线等

服务器端代码:

    class Threadtcp
    {
        private Socket server;
        public Threadtcp()
      {
        IPAddress local = Dns.GetHostAddresses(Dns.GetHostName())[0];
        IPEndPoint iep = new IPEndPoint(local, 30000);
        server = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
        server.Bind(iep);
        server.Listen(20);
        Console.WriteLine("等待客户机进行连接...");
        while (true)
        {
            Socket client = server.Accept();
            clientThread newclient = new clientThread(client);
            Thread newthread = new Thread(new ThreadStart(newclient.ClientService));
            newthread.Start(); 
        }
      }
    }
    class clientThread
    {
        public static int conn = 0;
        public Socket service;
        int i;
        public clientThread(Socket sc)
        {
            this.service = sc;
        }
        public void ClientService()
        {
            string data = null;
            byte[] bytes = new byte[1024];
            if (service != null)
                Console.WriteLine("新客户连接建立:{0}个连接数",++conn);
            while ((i = service.Receive(bytes)) != 0)
            {
                data = Encoding.ASCII.GetString(bytes,0,i);
                Console.WriteLine("收到的数据:{0}", data);
                data = data.ToUpper();
                byte[] msg = Encoding.ASCII.GetBytes(data);
                service.Send(msg);
                Console.WriteLine("发送的数据:{0}",data);
            }
            service.Close();
            Console.WriteLine("客户关闭连接:{0}个连接数",--conn);
        }
    }

客户端代码:
 class Program
    {
        static void Main(string[] args)
        {
            string str = null;
            while (str != "1")
            {
                byte[] buffer = new byte[1024];
                Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream,   ProtocolType.Tcp);
                IPAddress adr = IPAddress.Parse("192.168.1.100");
                IPEndPoint ep = new IPEndPoint(adr, 30000);
                str = Console.ReadLine();
                server.Connect(ep);                
                server.Send(Encoding.ASCII.GetBytes(str));
                int rec = server.Receive(buffer);//就在这里出错:“远程主机强迫关闭了一个现有的连接”
                Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, rec));
                server.Close();
                Console.WriteLine("断开了与服务器的连接...");
            }
        
        }
    }

当把客户端的IP地址换成外网服务器端的IP就不行了.另外,30000端口已打开,服务器操作系统是windows server 2003 enterprise 服务器WINDOWS防火墙已关闭.不过服务器有一个ARP防火墙客户端关不了,只能关闭ARP服务. --------------------编程问答-------------------- up --------------------编程问答-------------------- up --------------------编程问答-------------------- up
--------------------编程问答-------------------- Socket 学习 --------------------编程问答-------------------- 1. 对方关闭时没有调用  shutdown 而是直接调用 closesocket 时会出现这个问题
2. 对方的进程异常结束时 --------------------编程问答-------------------- 学习来。 --------------------编程问答-------------------- 你完全可以捕获这个异常,然后处理这个异常! --------------------编程问答-------------------- 这个是因为服务器端已经将连接断开了,
所以这个异常是需要捕获的,然后把连接断开,释放socket
如果需要重新连接,则去重新连接。 --------------------编程问答-------------------- 帮顶来。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,