一个封锁操作被对 WSACancelBlockingCall 的调用中断

这两天看了 C# Socket 编程  在关闭连接或终止监听的时候

遇到一个异常 “ 一个封锁操作被对 WSACancelBlockingCall 的调用中断” 

或者即使能终止监听 或断开与服务端的连接

但cpu的占用率猛涨 一直涨到100%  把我的 T400 都差点儿搞死机 风扇狂转 可怜我小黑了

但最后功夫不负有心人 还是让我给解决了  其实大多都是从网上看论坛找到的破解之道


下面奉上程序部分源码 

客户端:

    接收消息、发送消息 分别是:richTextBox1,richTextBox2

    服务器状态:txtStatus  文本框



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace TcpClientApp
{
    public partial class TcpClientFrm : Form
    {
        private TcpClient tcpSync;
        private bool isExit = false;
        public TcpClientFrm()
        {
            InitializeComponent();
        }

        private delegate void AddStatusDel(string msg);
        private delegate void ReceMessageDel(string msg);

        private void AddStatus(string msg)
        {

            if (txtStatus.InvokeRequired)
            {
                AddStatusDel d = AddStatus;
                txtStatus.Invoke(d, msg);
            }
            else
            {
                txtStatus.AppendText(msg);
            }
        }

        private void ReceMessage(string msg)
        {

            if (richTextBox1.InvokeRequired)
            {
                ReceMessageDel d = ReceMessage;
                richTextBox1.Invoke(d, msg);
            }
            else
            {
                richTextBox1.AppendText(msg);
                richTextBox1.ScrollToCaret();
            }

        }


        private void btnStartMonitor_Click(object sender, EventArgs e)
        {
            btnStartMonitor.Enabled = false;
            btnStopMonitor.Enabled = true;
            isExit = false;
            try
            {
                IPAddress ip = IPAddress.Parse(txtIP.Text);
                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
                tcpSync = new TcpClient();
                tcpSync.Connect(point);
                AddStatus("与主机:" + txtIP.Text + " 在端口:" + txtPort.Text + " 开始监听......."
                                    + "\r\n");

                Thread receiveThread = new Thread(ReceiveMsg);
                receiveThread.Start();
            }
            catch (Exception ex) {
               
                MessageBox.Show(ex.Message);
            }


        }

        private void ReceiveMsg()
        {
            while (isExit==false)
            {
                try
                {
                    
                    NetworkStream nStream = tcpSync.GetStream();
                    byte[] data = new byte[1024];
                    int len = nStream.Read(data, 0, data.Length);
                    if (len <= 0) {
                        break;
                    }
                    ReceMessage(System.Text.Encoding.BigEndianUnicode.GetString(data, 0, len) + "\r\n");
                    nStream.Flush();
                }
                catch (Exception ex) {
                   // MessageBox.Show(ex.Message);
                    break;
                }

            }


        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            try
            {
                NetworkStream nStream = tcpSync.GetStream();
                byte[] data = new byte[1024];
                data = System.Text.Encoding.BigEndianUnicode.GetBytes(richTextBox2.Text);
                nStream.Write(data, 0, data.Length);
                nStream.Flush();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnStopMonitor_Click(object sender, EventArgs e)
        {
            btnStartMonitor.Enabled = true;
            btnStopMonitor.Enabled = false;
            isExit = true;
            try
            {
                tcpSync.Close();
            }
            catch (Exception ex)
            {
               // MessageBox.Show(ex.Message);
            }
        }

 
    }
}

服务端:



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace TcpServerApp
{
    public partial class TcpServerFrm : Form
    {

        private Socket socketClient;
        private TcpListener tcpSync;
        bool isNormalExit = false;
        public TcpServerFrm()
        {
            InitializeComponent();
          
        }

        private delegate void AddStatusDel(string msg);
        private delegate void ReceMessageDel(string msg);

        private void AddStatus(string msg) {

            if (txtStatus.InvokeRequired)
            {
                AddStatusDel d = AddStatus;
                txtStatus.Invoke(d, msg);
            }
            else
            {
                txtStatus.AppendText(msg);
            }
        }

        private void ReceMessage(string msg)
        {

            if (richTextBox1.InvokeRequired)
            {
                ReceMessageDel d = ReceMessage;
                richTextBox1.Invoke(d, msg);
            }
            else
            {
                richTextBox1.AppendText(msg);
                richTextBox1.ScrollToCaret();
            }

        }

        private void btnStartMonitor_Click(object sender, EventArgs e)
        {
            btnStartMonitor.Enabled = false;
            btnStopMonitor.Enabled = true;
            isNormalExit = false;
            try
            {
                IPAddress ip = IPAddress.Parse(txtIP.Text);
                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
                tcpSync = new TcpListener(point);
                tcpSync.Start();
                AddStatus("主机:" + txtIP.Text + " 在端口:" + txtPort.Text + " 开始监听......."
                     + "\r\n");

                Thread accpThread = new Thread(AccpConnection);
                accpThread.Start();
            }
            catch (Exception ex) {
                MessageBox.Show(ex.Message);
            }


        }

        private void AccpConnection() {

            while (isNormalExit==false)
            {
                try
                {  
                    
                    socketClient = tcpSync.AcceptSocket();
                  
                    if (socketClient.Connected)
                    {

                        AddStatus("客户端:" +
                           socketClient.RemoteEndPoint.ToString() +
                           " 与服务器连接" + "\r\n");
                        Thread receiveThread = new Thread(ReceiveMsg);
                        receiveThread.Start();
                    }
                }
                catch(Exception ex) {
                    break;
                }
            }

        }

        private void ReceiveMsg() {

            while (isNormalExit==false)
            {
                
                try
                {
                    NetworkStream nStream = new NetworkStream(socketClient);
                    byte[] data = new byte[1024];
                    int len = nStream.Read(data, 0, data.Length);
                    if (len <= 0) {
                        break;
                    }
                    ReceMessage(System.Text.Encoding.BigEndianUnicode.GetString(data, 0, len) + "\r\n");
                    nStream.Flush();
                }
                catch (Exception ex) {

                   
                }
            }

        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            try {
                NetworkStream nStream = new NetworkStream(socketClient);
                byte[] data = new byte[1024];
                data = System.Text.Encoding.BigEndianUnicode.GetBytes(richTextBox2.Text);
                nStream.Write(data, 0, data.Length);
                nStream.Flush();
            }
            catch (Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnStopMonitor_Click(object sender, EventArgs e)
        {
            btnStartMonitor.Enabled = true;
            btnStopMonitor.Enabled = false;
            isNormalExit = true;
            try {

                AddStatus("主机:" + txtIP.Text + " 在端口:" + txtPort.Text + " 停止监听......."
                    + "\r\n");
                tcpSync.Stop();
                if (socketClient!=null)
                {
                    socketClient.Close();
                }
              
               
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void TcpServerFrm_Load(object sender, EventArgs e)
        {

        }
        
        
    }
}


--------------------------------------------

程序下载地址:

http://dl.dbank.com/c0bjz71qpd

--------------------------------------------





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值