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

c#写的socket程序总是卡死解决思路

2012-06-01 
c#写的socket程序总是卡死最近要做c#课程设计,实说c#没怎么学,就是对socket和多线程了解了一下。现在在做练

c#写的socket程序总是卡死
最近要做c#课程设计,
实说c#没怎么学,就是对socket和多线程了解了一下。
现在在做练习,
写了示例程序,发现程序很慢,经常卡到死。
这是为什么呢??
服务端主要代码

C# code
   private void getipandhostname() {//获取本机的ip和hostname            String hostInfo = Dns.GetHostName();            System.Net.IPAddress addr;             addr = new System.Net.IPAddress(Dns.GetHostByName(Dns.GetHostName()).AddressList[0].Address);            this.ip = addr.ToString();            this.hostname = Dns.GetHostName();        }        private void button2_Click(object sender, EventArgs e)//启动监听端口        {            this.getipandhostname();            this.myip = IPAddress.Parse(this.ip);            try            {                this.myserver = new IPEndPoint(myip, Int32.Parse("1111"));                this.sesock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                this.sesock.Bind(this.myserver);//绑定端口                this.listBox1.Items.Add("主机:"+this.hostname+";ip:"+this.ip+"开始监听端口1111");                this.resock = this.sesock.Accept();//开始接受                Thread thread = new Thread(new ThreadStart(targett));//启动另外一个线程来接受信息                thread.Start();            }            catch (Exception te)            {                MessageBox.Show(te.Message);            }        }                private void targett()        {            Control.CheckForIllegalCrossThreadCalls = false;            if (this.resock.Connected)            {                this.listBox1.Items.Add("连接已建立!");                while (flag)                {                    Byte[] r_data = new Byte[64];                    this.resock.Receive(r_data, r_data.Length, 0);//接受数据                    string str = System.Text.Encoding.BigEndianUnicode.GetString(r_data);                    string temp=((IPEndPoint)resock.RemoteEndPoint).Address.ToString();                    this.listBox1.Items.Add(temp+"\n");                }            }        }

客户端主要代码,
服务端卡死,客户端也就连不上,这段代码算是没测试。
C# code
 private void button1_Click(object sender, EventArgs e)//建立连接        {            this.ip = this.textBox1.Text;            this.myip = IPAddress.Parse(this.ip);            this.myserver = new IPEndPoint(this.myip, Int32.Parse("22"));            this.sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            this.sock.Connect(this.myserver);            this.toolStripLabel1.Text = "与服务器建立联系";            Thread thread = new Thread(new ThreadStart(targett));//启动另外一个线程来接受信息            thread.Start();        }        private void targett() {//接受服务器返回的信息            Control.CheckForIllegalCrossThreadCalls = true;            while(flag){                Byte[] r_data=new Byte[64];                sock.Receive(r_data,r_data.Length,0);                string str = System.Text.Encoding.BigEndianUnicode.GetString(r_data);                this.toolStrip1.Text = str;            }        }        private void button3_Click(object sender, EventArgs e)//发送消息        {            string first = "new.txt";            string second = "contents";            string thired = "end!";            try {                 Byte[] s_data=new Byte[64];                string send = first;                s_data = System.Text.Encoding.BigEndianUnicode.GetBytes(send.ToCharArray());                sock.Send(s_data,s_data.Length,0);            }catch(Exception te){                MessageBox.Show(te.Message);            }        }

希望各位大神指点一二。

[解决办法]
貌似这句写错地方了吧?this.resock = this.sesock.Accept();//开始接受


我已经很久没写了的忘记了。我觉得是写错了楼上的觉得呢?
[解决办法]

C# code
                      while (flag&&this.resock.Connected)//先判断是否连接了再接受数据。。你放外面。。没用                {                                      Byte[] r_data = new Byte[64];                    int recvCount=this.resock.Receive(r_data, r_data.Length, 0);//先判断是否接受到了数据再进行处理                    if(recvCount>0)             {                    string str = System.Text.Encoding.BigEndianUnicode.GetString(r_data);                    string temp=((IPEndPoint)resock.RemoteEndPoint).Address.ToString();                    this.listBox1.Items.Add(temp+"\n");             }                }
[解决办法]
探讨
引用:

貌似这句写错地方了吧?this.resock = this.sesock.Accept();//开始接受

我已经很久没写了的忘记了。我觉得是写错了楼上的觉得呢?

之前有文章说需要把accept单独放到一个线程当中,
但是不是很理解。

[解决办法]
Socket本身支持异步编程,你应该看看那个Begin开头的一些列方法,参考MSDN

你这个程序卡死的原因只有一个,那就是“this.resock = this.sesock.Accept();//开始接受”,这行代码不执行肯定不卡,一执行必卡,因为它是阻塞模式运行的,除非你在其它线程中执行,否则会阻塞当前线程。所谓的阻塞,就是当前线程卡住(界面的反映就是卡死),不让线程运行或响应任何消息,后续代码也不让执行。
[解决办法]
探讨
Socket本身支持异步编程,你应该看看那个Begin开头的一些列方法,参考MSDN

你这个程序卡死的原因只有一个,那就是“this.resock = this.sesock.Accept();//开始接受”,这行代码不执行肯定不卡,一执行必卡,因为它是阻塞模式运行的,除非你在其它线程中执行,否则会阻塞当前线程。所谓的阻塞,就是当前线程卡住(界面的反映就是卡死),不让线程运行或响应任何消息,……

热点排行