首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

socket 通信远程主机强迫关闭了一个现有的连接。

2012-03-24 
socket 通信远程主机强迫关闭了一个现有的连接。急!!!在线等。我最近写了一个局域网通信的程序, 用到了多线

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发送完之后在开始呢》 应该怎么办。

[解决办法]
参考远程主机强迫关闭了一个现有的连接

热点排行