日期:2014-05-18  浏览次数:21909 次

socket 通信远程主机强迫关闭了一个现有的连接。急!!!在线等。
我最近写了一个局域网通信的程序, 用到了多线程和socket来传输文件、发送消息,主服务器的线程中有一个UDP广播, 每隔三秒向局域网内广播一次,当有重服务器上线时,向主服务器注册。 主服务器还可以控制从服务器, 向其发送消息, 但是, 问题出现了, 主服务器发送的消息,有些时候从服务器能收到, 有些时候就抛出异常 “远程主机强迫关闭了一个现有的连接。”这是什么问题,应该怎么解决啊。 
UDP代码:
C# code

        public void sendUdp()
        {
            string str = "I'm running";

            UdpClient udp = new UdpClient(2525);
            try
            {
                while (true)
                {
                    IPAddress ipAdd = IPAddress.Parse("255.255.255.255");
                    IPEndPoint end = new IPEndPoint(ipAdd, 2020);
                    
                    try
                    {
                        byte[] sendByte = Encoding.Unicode.GetBytes(str);
                        udp.Send(sendByte, sendByte.Length, end);
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                        Thread.Sleep(3000);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                throw;
            }
        }



TCP代码
C# code

        public void sendTcp(string ipAddress,string str) 
        {
            IPAddress ip = IPAddress.Parse(ipAddress);
            IPEndPoint ipep = new IPEndPoint(ip, 2025);

            //创建套接字   
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //连接到发送端 
            try
            {
                    client.Connect(ipep);
            }
            catch (Exception) 
            {
                MessageBox.Show("指定的从服务器已意外关闭, 链接不上");
            }
            if (client.Connected)
            {
                try
                {
                    this.SendVarData(client, Encoding.Unicode.GetBytes(str));
                }
                catch (Exception)
                {
                    MessageBox.Show("传输文件失败!");
                    throw;
                }

        public static int SendVarData(Socket s, byte[] data)
        {
            int total = 0;
            int size = data.Length;
            int dataleft = size;
            int sent;
            byte[] datasize = new byte[4];
            datasize = BitConverter.GetBytes(size);
            sent = s.Send(datasize);

            while (total < size)
            {
                sent = s.Send(data, total, dataleft, SocketFlags.None);
                total += sent;
                dataleft -= sent;
            }

            return total;
        }




是不是线程的互斥问题。 因为UDP 每隔三秒发送一次, 当我点击按钮进行消息发送TCP的时候由于线程冲突强制停止的, 我应该怎么解决?

------解决方案--------------------
学习...
------解决方案--------------------
1)考虑从服务器防火墙的问题
2)SendVarData,如果数据量大,会阻塞,考虑新开线程做,并适当的Sleep
3)保证client.Connect(ipep);之前可能存在的前一个连接已经关闭

------解决方案--------------------
三秒发一次。。。

如果数据量大。。可能造成线程阻塞。。。
------解决方案--------------------
学习下
------解决方案--------------------
探讨
在广播之前我能不能让UDP线程等待TCP发送完之后在开始呢》 应该怎么办。

------解决方案--------------------
参考远程主机强迫关闭了一个现有的连接