public partial class frmMain : Form
    {
        private string hostname = "\u0077\u0077\u0077\u002e\u0068\u0061\u006f\u006c\u0069\u0061\u006f\u007a\u0069\u002e\u0063\u006f\u006d";
        private int port = 80;
        private Encoding en = Encoding.GetEncoding("GB2312");
        private string page = "/test/MySocket.asp";
        private string templete =
@"GET {0} HTTP/1.1
Host:{1}
Connection:close
User-agent:Mozilla/4.0
Accept-language:zh-cn";
        //private IPEndPoint localPoint = null;//本地端点
        //private IPEndPoint remotePoint = null;//远程端点        public frmMain()
        {
            InitializeComponent();
        }        private void btnConnection_Click(object sender, EventArgs e)
        {
            btnConnection.Enabled = false;
            Connection(hostname,port, page);
            GC.Collect();
            btnConnection.Enabled = true;
        }        private void Connection(string hostname, int port, string page)
        {
            IPEndPoint localPoint = null;//本地端点
            IPEndPoint remotePoint = null;//远程端点
            IPAddress localAddress = Dns.GetHostAddresses(Dns.GetHostName())[0];
            localPoint = new IPEndPoint(localAddress, IPEndPoint.MinPort);
            IPAddress remoteAddress = Dns.GetHostAddresses(hostname)[0];
            remotePoint = new IPEndPoint(remoteAddress, port);
            TcpClient tc = new TcpClient();
            string content = string.Format(templete, page, hostname);            //设置本地端点
            if (localPoint.Port == IPEndPoint.MinPort)
            {
                while (true)
                {
                    localPoint.Port++;
                    try
                    {
                        tc.Client.Bind(localPoint);
                        break;
                    }
                    catch
                    {
                    }
                }
            }
            else
            {
                try
                {
                    tc.Client.Bind(localPoint);
                }
                catch (Exception ex)
                {
                    txtTarget.Text = "[端口] " + ex.Message;
                    return;
                }
            }
            this.Text = localPoint.ToString();
            //连接
            try
            {
                tc.Connect(remotePoint);
            }
            catch (Exception ex) //有时会报这个错: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
            {
                txtTarget.Text = "[连接] " + ex.Message;
                return;
            }            NetworkStream stream = null;
            try
            {
                stream = tc.GetStream();
            }
            catch (Exception ex)
            {
                txtTarget.Text = "[流] " + ex.Message;
                tc.Close();
                return;
            }
            try
            {
                //写
                byte[] data = en.GetBytes(content);
                stream.Write(data, 0, data.Length);
            }
            catch (Exception ex)
            {
                txtTarget.Text = "[写] " + ex.Message;
            }
            try
            {
                //读
                byte[] data2 = new byte[1024];
                stream.Read(data2, 0, 1024);
                string result = en.GetString(data2);
                txtTarget.Text = result;
            }
            catch (Exception ex)
            {
                txtTarget.Text = "[读]" + ex.Message;
            }
            //关闭
            stream.Close();
            tc.Client.Close();
            tc.Close();
        }        private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
        }
    }多点几次btnConnection就会报错了:
通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 202.104.236.110:80有不少人问过这样的问题了,不过我的情况不太一样。
这里报错的是远程的端口....
我把该关的都关了,并且强制回收了垃圾....

解决方案 »

  1.   

    。你这个程序好乱。。
    首先 GC.Collect();这个没有用
    如果程序运行到Read或者Write的时候程序都会等待的
    都无法直接关闭的
    而且请原谅我笨,我真看不懂你的程序
      

  2.   


    先 Shutdown(SocketShutdown.Both) 一下看看可以不 
      

  3.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;using System.Management;using LanServer.Utilities;namespace LanServer
    {
        public partial class FormNetStart : Form
        {
            public FormNetStart()
            {
                InitializeComponent();
            }
            System.Net.IPAddress[] HostIPAddress;        private System.Net.IPAddress ipsetted;        public System.Net.IPAddress StartIP
            {
                get { return ipsetted; }
                set { ipsetted = value; }
            }
            private int portsetted;        public int StartPort 
            {
                get { return portsetted; }
                set { portsetted = value; }
            }
            private void FormNetStart_Load(object sender, EventArgs e)
            {
               //HostIPAddress= Utilities.Utilities. LocalHostIPAddress;
               //string[] ali = Utilities.Utilities.Aliases;
               //for (int i = 0; i < HostIPAddress.Length; i++)
               //{
               //     // 显示当前ip;
               //    this.cdIPAddressList.Items.Add(HostIPAddress[i].ToString());
               //}            //SELECT   *   FROM   Win32_NetworkAdapterConfiguration")   
                try
                {
                    ///将本机的网卡加到列表显示Win32_NetworkAdapterConfiguration 
                    ///
                    ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
                    ManagementObjectCollection moc = mc.GetInstances();
                    //ArrayList strArr = new ArrayList();                //网卡数   
                    //foreach (ManagementObject mo in moc)
                    //{
                    //    if ((bool)mo["IPEnabled"])
                    //    {
                    //        //cdIPAddressList.Items.Add(mo["Caption"].ToString().Substring(10));
                    //        //cdIPAddressList.Items.Add(mo["MacAddress"].ToString());                //        string[] iplist = mo["IPAddress"] as string[];
                    //        cdIPAddressList.Items.AddRange(iplist);
                    //    }
                    //    mo.Dispose();                //}
                    List<string> iplist = new List<string>();
                    List<string> caplist = new List<string>();                foreach (ManagementObject mo in moc)
                    {
                        if ((bool)mo["IPEnabled"])
                        {
                            //cdIPAddressList.Items.Add(mo["Caption"].ToString().Substring(10));
                            //cdIPAddressList.Items.Add(mo["MacAddress"].ToString());                        caplist.Add(mo["Caption"].ToString().Substring(10));
                            //cdIPAddressList.Items.AddRange(iplist);
                        }
                        mo.Dispose();                }
                    foreach (ManagementObject mo in moc)
                    {
                        if ((bool)mo["IPEnabled"])
                        {
                            //cdIPAddressList.Items.Add(mo["Caption"].ToString().Substring(10));
                            //cdIPAddressList.Items.Add(mo["MacAddress"].ToString());                        iplist.AddRange(mo["IPAddress"] as string[]);
                            //cdIPAddressList.Items.AddRange(iplist);
                        }
                        mo.Dispose();                }
                    if (iplist.Count == caplist.Count)
                    {                    for (int c = 0; c < caplist.Count; c++)
                        {
                            //if (caplist[c].Substring(0,4).StartsWith(" WAN ") == false)
                            //{//VPN网路要去掉
                            //    cdIPAddressList.Items.Add(caplist[c] + "|" + iplist[c]);
                            //}
                            //string ipitem = caplist[c] + "|" + iplist[c];                        cdIPAddressList.Items.Add(caplist[c] + "|" + iplist[c]);
                        }
                        if (cdIPAddressList.Items.Count > 0)
                            cdIPAddressList.SelectedIndex = 0;                }
                    else
                    {
                        throw new ArgumentNullException("ManagementObject", "未能获得本机网络参数,请打开WMI服务");
                    } 
                }
                catch (ManagementException mex)
                {
                    LanServer.BizLogic.LogWriter.AddSystemException(mex);
                }
                catch (System.Security.SecurityException sex)
                {                LanServer.BizLogic.LogWriter.AddSystemException(sex);
                }
                catch (Exception ex) {
                    LanServer.BizLogic.LogWriter.AddSystemException(ex);
                }        }        private void btnStart_Click(object sender, EventArgs e)
            {
                if (cdIPAddressList.SelectedItem == null)
                {
                    return;
                }
                //else
                //{|| Utilities.Utilities.ValidateIPAddress(cdIPAddressList.Text) == false
                //    ipsetted = HostIPAddress[cdIPAddressList.SelectedIndex];
                //}
                if (string.IsNullOrEmpty(this.nudPort.Text))
                {
                    return;
                }
                if (nudPort.Value  < 1023 || nudPort.Value > 65535)
                {
                    //MessageBox.Show(nudPort.Value.ToString());
                    nudPort.Value = 9051;
                    return;
                }            //MessageBox.Show(cdIPAddressList.SelectedItem.ToString().Split ('|')[1]);            //ipsetted = HostIPAddress[cdIPAddressList.SelectedIndex];
                ipsetted = System.Net.IPAddress.Parse(cdIPAddressList.SelectedItem.ToString().Split('|')[1]);
                portsetted = (int)nudPort.Value;
                //检查端口占用
                if (Utilities.Utilities.IsBindEndPoint(ipsetted, portsetted) == true)
                {
                    System.Windows.Forms.MessageBox.Show("监听端口已被其他程序占用,不能正确获得在线播放器信息,请修改程序设置?",
                         "UDP端口占用错误", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
                    return;            }            btnStart.DialogResult = DialogResult.OK;
                this.DialogResult = btnStart.DialogResult;
            }
        }
    }
      

  4.   

      
            /// <summary>
            /// UDP检查端口绑定
            /// </summary>
            /// <param name="localip"></param>
            /// <param name="port"></param>
            /// <returns></returns>
            public static bool IsBindEndPoint(System.Net.IPAddress localip,int port)
            {
                System.Net.IPEndPoint ipe = new System.Net.IPEndPoint(localip, port);
                System.Net.Sockets.Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
               
                try
                {
                    s.Bind(ipe);
                    return false;
                }
                catch (System.Net.Sockets.SocketException ex)
                {
                    if (ex.SocketErrorCode == System.Net.Sockets.SocketError.AddressAlreadyInUse)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                finally
                {
                    s.Close();
                    s = null;
                }
            }        /// <summary>
            /// 判断是否合法IP   /// </summary>
            /// <param name="strIP"></param>
            /// <returns></returns>
            public static bool ValidateIPAddress(string strIP)
            {
                //if (null == strIP || "" == strIP.Trim() || Convert.IsDBNull(strIP))
                if (string.IsNullOrEmpty(strIP.Trim()) || Convert.IsDBNull(strIP))
                { return false; }            return System.Text.RegularExpressions.Regex.IsMatch(strIP, @"^((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$");
            }希望这段对你有帮助
    我的程序是要求启动主窗口时就检查绑定
      

  5.   

    很简单,不要调用关闭流、连接就什么事也没了。。   stream.Close();
                tc.Client.Close();
                tc.Close();
      

  6.   

     private int port = 80;
    把80这个端口换成别的端口,每运行一次程序,都要换一个没用过的端口,因为,再上一次运行的时候,端口已经被绑定占用了