socket是一个稀缺资源,所以最好用线程的互斥来解决这个问题,打开时加锁,释放时删除锁,当然这锁只对你的程序有作用;或许还有更好的方法;

解决方案 »

  1.   

    这个程式是SERVER端,采用SOCKET来监听CLIENT发来的信息,SERVER采用了Threed。
    如果这个程式的Threed已经开启了,哪么我再开启一次的时候就会报错,程式就会死掉。
    如何防止当我再开程式,导致程式的死掉的方法啊?
      

  2.   

    以前也遇到过这个问题,后来发现。在线程中就结束Socket就会快速释放端口了。。
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Threading;
    using System.Net;
    using System.Net.Sockets;
    namespace CSocket
    {
        public partial class Form1 : Form,IDisposable
        {
            public Form1()
            {
                InitializeComponent();            this.button3.Enabled = false;
            }        Socket socket = null;        UdpClient m_client = null;        Socket m_socket = null;        bool BeginDisconnection = false;        IPAddress ipaddress = IPAddress.Parse("127.0.0.1");        private void button1_Click(object sender, EventArgs e)
            {
                Thread thread = new Thread(new ThreadStart(BeginListening));            thread.Start();            BeginDisconnection = false;            this.button1.Enabled = false;            this.button3.Enabled = true;
            }        private void button2_Click(object sender, EventArgs e)
            {
                SendMessage(this.textBox2.Text);
            }
            [STAThread]
            private void BeginListening()
            {
                try
                {
                    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                IPEndPoint ipPort = new IPEndPoint(ipaddress, 13000);                socket.Bind(ipPort); socket.Listen(0);                this.textBox1.Text += "开始绑定并启用Socket..\r\n";                while (!BeginDisconnection)
                    {
                        Socket handler = socket.Accept();                    byte[] bytes = new byte[1024];                    int bytesRec = handler.Receive(bytes);                    string m_String = Encoding.Default.GetString(bytes);                    IPEndPoint ipPoint = (IPEndPoint)handler.RemoteEndPoint;                    handler.Shutdown(SocketShutdown.Both);//停止接收信息                    handler.Disconnect(true); handler.Close();                    if (m_String.IndexOf("<EOF>") > -1)
                        {                        socket.Close(); BeginDisconnection = false;                        this.textBox1.Text += "\r\n成功关闭Socket连接..\r\n"; this.button1.Enabled = true; break;
                        }
                        else { this.textBox1.Text += "\r\n" + ipPoint.Address.ToString() + ":" + ipPoint.Port.ToString() + ":" + m_String; }                    Thread.Sleep(100);
                    }
                    
                }
                catch (SocketException se) { MessageBox.Show(se.Message); }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }        private void button3_Click(object sender, EventArgs e)
            {
                SendMessage("<EOF>");
            }        //发送消息
            private void SendMessage(string s)
            {
                try
                {
                    m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);                IPEndPoint ipPort = new IPEndPoint(ipaddress, 13000);                m_socket.Connect(ipPort);                byte[] bytes = Encoding.Default.GetBytes(s);                m_socket.Send(bytes);                m_socket.Shutdown(SocketShutdown.Both);                m_socket.Close();
                }
                catch (ArgumentException ae) { this.textBox1.Text += ae.Message + "\r\n"; }
                catch (SocketException se) { this.textBox1.Text += se.Message + "\r\n"; }
                catch (Exception ex) { this.textBox1.Text += ex.Message + "\r\n"; }
            }        private void button4_Click(object sender, EventArgs e)
            {
                try
                {
                    m_client = new UdpClient();                IPEndPoint s_IP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 13000);                m_client.Connect(s_IP);                m_client.Send(Encoding.Default.GetBytes(this.textBox2.Text), Encoding.Default.GetBytes(this.textBox2.Text).Length);                m_client.Close();
                }
                catch (ArgumentException ae) { this.textBox1.Text += ae.Message + "\r\n"; }
                catch (SocketException se) { this.textBox1.Text += se.Message + "\r\n"; }
                catch (Exception ex) { this.textBox1.Text += ex.Message + "\r\n"; }
            }
        }

      

  3.   

    根据你的需求,给你提供一个最简单的办法:1:增加一个全局bool变量。
    bool IsBeginListen=false;2:BeginListen函数内,修改该全局变量。
    BeginListen()

       .........
       IsBeginListen=true;
       ...........
    }3:启动线程的时候,判断该变量:if(IsBeginListen=true)
    {
        Thread re = new Thread(new ThreadStart(BeginListen));
        re.IsBackground = true;
        re.Start();
    }
      

  4.   

    少写了一个等号:
    if(IsBeginListen==true) 
      

  5.   

    今天又写了一个。这个还算比较完美了
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    using System.Reflection;namespace ConsoleApplication1
    {
        public class Program
        {
            Thread[] SocketThreadList = new Thread[100];        static Socket TCPListen = null;        static void Main(string[] args)
            {
                TCPListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                
                IPEndPoint LocalPort = new IPEndPoint(IPAddress.Any, 55000);            TCPListen.Bind(LocalPort); TCPListen.Listen(100);            Thread AcceptThread = new Thread(new ThreadStart(AcceptWorkThread));            AcceptThread.Start();            Console.WriteLine("****** 软创通信服务器程序 ******");            Console.WriteLine(string.Format("开始监听 <{0}>", LocalPort));            Console.WriteLine("单击回车键退出SOCKET");            Console.ReadLine(); GC.Collect(); GC.WaitForPendingFinalizers();
            }        // 接收连接线程
            [STAThread]
            static void AcceptWorkThread()
            {
                // 指示为后台线程
                Thread.CurrentThread.IsBackground = true;            while (true)
                {
                    // 为新建连接创建新的Socket实例
                    Socket s_Accept = TCPListen.Accept();                IPEndPoint remoteAddress = (IPEndPoint)s_Accept.RemoteEndPoint;                Console.WriteLine(string.Format("接收到来自 {0} 的连接", remoteAddress));                // 接收数据专用线程                Thread ReceiveThread = new Thread(new ParameterizedThreadStart(ReceiveWorkThread));                ReceiveThread.Start(s_Accept);                Thread.Sleep(100);
                }
            }        static void ReceiveWorkThread(object obj)
            {
                Thread.CurrentThread.IsBackground = true;   // 标识后台线程            Socket s_Receive = (Socket)obj;            byte[] buffer = new byte[1024];     // 创建接收缓冲            IPEndPoint remoteAddress = (IPEndPoint)s_Receive.RemoteEndPoint;            try
                {
                    while (s_Receive.Connected)
                    {
                        if (s_Receive.Connected)
                        {                        int ReceiveCount = s_Receive.Receive(buffer);                        Console.WriteLine(string.Format("{0}:{1}", remoteAddress, Encoding.Default.GetString(buffer)));                        // 返回接收成功数据
                            s_Receive.Send(Encoding.Default.GetBytes("AAA"));                        Thread.Sleep(100);
                        }
                        else { s_Receive.Close(); break; }
                    }
                }
                catch { Console.WriteLine(string.Format("{0} 断开连接", remoteAddress)); }
            }
        }
    }