由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。急求解决啊!

Tube_Z 2015-01-29 10:49:02
System.Net.Sockets.SocketException: 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。


[SocketException (0x2747): 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。]
System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) +5327494
System.Net.Sockets.Socket.InternalBind(EndPoint localEP) +99
System.Net.Sockets.Socket.BeginConnectEx(EndPoint remoteEP, Boolean flowContext, AsyncCallback callback, Object state) +207
System.Net.Sockets.Socket.BeginConnect(EndPoint remoteEP, AsyncCallback callback, Object state) +125
MySql.Data.Common.StreamCreator.CreateSocketStream(IPAddress ip, Boolean unix) +168
MySql.Data.Common.StreamCreator.GetStream(UInt32 timeout) +389
MySql.Data.MySqlClient.NativeDriver.Open() +219

这种东西我都关闭了. 为什么一会就又出现了.
SMTPClient smtpcMail = new SMTPClient();
smtpcMail.Close();

现在解决只能重启服务器了.
...全文
8567 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tube_Z 2015-01-30
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
哦,类本身没有问题 返回dataset的方法使用了using 问题是如果你使用ExecuteReader方法 那么你需要手动释放连接

 #region 事务操作
        /// <summary>
        /// 用提供的函数,执行SQL命令,返回一个从指定连接的数据库记录集
        /// </summary>
        /// <param name="connectionString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="commandType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="commandText">SQL语句或存储过程</param>
        /// <param name="commandParameters">SqlParameter[]参数数组</param>
        /// <returns>SqlDataReader:执行结果的记录集</returns>
        public static MySqlDataReader ExecuteReader(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
        {
            MySqlCommand cmd = new MySqlCommand();
            MySqlConnection conn = new MySqlConnection(connString);
            MySqlDataReader rdr = null;

            // 我们在这里用 try/catch 是因为如果这个方法抛出异常,我们目的是关闭数据库连接,再抛出异常,
            // 因为这时不会有DataReader存在,此后commandBehaviour.CloseConnection将不会工作。
            try
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
                rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return rdr;
            }
            catch
            {
                rdr.Close();
                conn.Close();
                throw;
            }
        }
这个地方我都close. 怎么还是出现. 这次出现了 源错误 源错误: 只有在调试模式下进行编译时,生成此未处理异常的源代码才会显示出来。若要启用此功能,请执行以下步骤之一,然后请求 URL: 1. 在产生错误的文件的顶部添加一条“Debug=true”指令。例如: <%@ Page Language="C#" Debug="true" %> 或: 2. 将以下的节添加到应用程序的配置文件中: <configuration> <system.web> <compilation debug="true"/> </system.web> </configuration> 请注意,第二个步骤将使给定应用程序中的所有文件在调试模式下进行编译;第一个步骤仅使该特定文件在调试模式下进行编译。 重要事项: 以调试模式运行应用程序一定会产生内存/性能系统开销。在部署到生产方案之前,应确保应用程序调试已禁用。 堆栈跟踪: [SocketException (0x2747): 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。] System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) +5327494 System.Net.Sockets.Socket.InternalBind(EndPoint localEP) +99 System.Net.Sockets.Socket.BeginConnectEx(EndPoint remoteEP, Boolean flowContext, AsyncCallback callback, Object state) +207 System.Net.Sockets.Socket.BeginConnect(EndPoint remoteEP, AsyncCallback callback, Object state) +125 MySql.Data.Common.StreamCreator.CreateSocketStream(IPAddress ip, Boolean unix) +168 MySql.Data.Common.StreamCreator.GetStream(UInt32 timeout) +389 MySql.Data.MySqlClient.NativeDriver.Open() +219
於黾 2015-01-29
  • 打赏
  • 举报
回复
哦,类本身没有问题 返回dataset的方法使用了using 问题是如果你使用ExecuteReader方法 那么你需要手动释放连接
於黾 2015-01-29
  • 打赏
  • 举报
回复
引用 2 楼 Tube_Z 的回复:
[quote=引用 1 楼 Z65443344 的回复:] 仔细看错误信息,是你MySqlClient里出了问题,跟SMTP有什么关系
http://bbs.csdn.net/topics/330076124 这个帖子里也是相同的问题. 他的就是释放 smtp的资源... 就解决了的. [/quote] 你们俩只是报的错误相同,报错的原因完全不一样 他是从网上抓取html 而你是访问数据库 MySqlDBHelp这个类,你使用了长连接,只open,不close? 我看你只在catch里close,其他地方都没有close,那连接池不一会就满了
Tube_Z 2015-01-29
  • 打赏
  • 举报
回复

public class MySqlDBHelp
    {
        private static MySqlConnection _connection;
        /// <summary>
        /// 获取数据库连接桥
        /// </summary>
        private static MySqlConnection Connection
        {
            get
            {
                string connectionString = ConfigurationManager.AppSettings["MYSQLConnString"];
                if (_connection == null)
                {
                    _connection = new MySqlConnection(connectionString);
                    _connection.Open();
                }
                if (_connection.State == ConnectionState.Closed)
                {
                    _connection.Open();
                }
                if (_connection.State == ConnectionState.Broken)
                {
                    _connection.Close();
                    _connection.Open();
                }
                return _connection;
            }

        }

        #region 数据获取和执行类
        /// <summary>
        /// 获取表数据
        /// </summary>
        /// <param name="sql"></param>
        /// <returns></returns>
        public static MySqlDataReader GetDataRead(string sql)
        {
            MySqlCommand command = new MySqlCommand(sql, Connection);
            MySqlDataReader read = command.ExecuteReader();

            return read;
        }
        public static int ExecuteNonQuery(string sql)
        {
            MySqlCommand command = new MySqlCommand(sql, Connection);
            int row = command.ExecuteNonQuery();
            return row;
        }

        public static DataTable ExecuteDataTable(string sql)
        {
            string connString = ConfigurationManager.AppSettings["MYSQLConnString"];
            DataSet ds = ExecuteDataSet(connString,CommandType.Text,sql);
            return ds.Tables[0];
        }

        /// <summary>
        /// 执行sql语句,返回一行一列。。
        /// </summary>
        /// <param name="sql">SQL语句</param>
        /// <returns></returns>
        public static string GetScalar(string sql)
        {
            MySqlCommand command = new MySqlCommand(sql, Connection);
            return command.ExecuteScalar().ToString();
        }

        #endregion


        #region 事务操作
        /// <summary>
        /// 用提供的函数,执行SQL命令,返回一个从指定连接的数据库记录集
        /// </summary>
        /// <param name="connectionString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="commandType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="commandText">SQL语句或存储过程</param>
        /// <param name="commandParameters">SqlParameter[]参数数组</param>
        /// <returns>SqlDataReader:执行结果的记录集</returns>
        public static MySqlDataReader ExecuteReader(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms)
        {
            MySqlCommand cmd = new MySqlCommand();
            MySqlConnection conn = new MySqlConnection(connString);

            // 我们在这里用 try/catch 是因为如果这个方法抛出异常,我们目的是关闭数据库连接,再抛出异常,
            // 因为这时不会有DataReader存在,此后commandBehaviour.CloseConnection将不会工作。
            try
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParms);
                MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                return rdr;
            }
            catch
            {
                conn.Close();
                throw;
            }
        }

        /// <summary>
        /// 用提供的函数,执行SQL命令,返回一个从指定连接的数据库记录集
        /// </summary>
        /// <param name="connectionString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="commandType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="commandText">SQL语句或存储过程</param>
        /// <returns>SqlDataReader:执行结果的记录集</returns>
        public static MySqlDataReader ExecuteReader(string connString, CommandType cmdType, string cmdText)
        {
            return ExecuteReader(connString, cmdType, cmdText, (MySqlParameter[])null);
        }

        /// <summary>
        /// 用提供的方法,执行带参数的SQL命令,返回值为该命令所影响的行数
        /// </summary>
        /// <param name="connString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="cmdText">SQL语句或存储过程</param>
        /// <param name="cmdParameters">SQL语句所带的参数集</param>
        /// <returns>int:该命令所影响的行数</returns>
        public static int ExecuteNonQuery(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParameters)
        {

            MySqlCommand cmd = new MySqlCommand();

            using (MySqlConnection conn = new MySqlConnection(connString))
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParameters);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                return val;
            }
        }


        /// <summary>
        /// 用提供的方法,执行SQL命令,返回值为该命令所影响的行数
        /// </summary>
        /// <param name="connString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="cmdText">SQL语句或存储过程</param>
        /// <returns>int:该命令所影响的行数</returns>
        public static int ExecuteNonQuery(string connString, CommandType cmdType, string cmdText)
        {
            return ExecuteNonQuery(connString, cmdType, cmdText, (MySqlParameter[])null);
        }


        /// <summary>
        /// 用提供的方法,执行带参数的SQL命令,返回值为结果集中第一行的第一列或空引用(如果结果集为空)。
        /// </summary>
        /// <param name="connString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="cmdText">SQL语句或存储过程</param>
        /// <param name="cmdParameters">SQL语句所带的参数集</param>
        /// <returns></returns>
        public static string ExecuteScalar(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParameters)
        {
            MySqlCommand cmd = new MySqlCommand();
            using (MySqlConnection conn = new MySqlConnection(connString))
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParameters);
                return cmd.ExecuteScalar().ToString();
            }

        }


        /// <summary>
        /// 用提供的方法,执行SQL命令,返回值为结果集中第一行的第一列或空引用(如果结果集为空)。
        /// </summary>
        /// <param name="connString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="cmdText">SQL语句或存储过程</param>
        /// <returns></returns>
        public static string ExecuteScalar(string connString, CommandType cmdType, string cmdText)
        {
            return ExecuteScalar(connString, cmdType, cmdText, (MySqlParameter[])null);
        }



        /// <summary>
        /// 用提供的方法,执行带参数的SQL命令,返回值为DataSet数据集
        /// </summary>
        /// <param name="connString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="cmdText">SQL语句或存储过程</param>
        /// <param name="cmdParameters">SQL语句所带的参数集</param>
        /// <returns>Datat:该命令的结果集</returns>
        public static DataSet ExecuteDataSet(string connString, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParameters)
        {
            MySqlCommand cmd = new MySqlCommand();

            using (MySqlConnection conn = new MySqlConnection(connString))
            {

                PrepareCommand(cmd, conn, null, cmdType, cmdText, cmdParameters);
                MySqlDataAdapter ada = new MySqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                ada.Fill(ds);
                cmd.Parameters.Clear();
                return ds;
            }
        }


        /// <summary>
        /// 用提供的方法,执行SQL命令,返回值为DataSet数据集
        /// </summary>
        /// <param name="connString">SqlConnection有效的SQL连接字符串</param>
        /// <param name="cmdType">CommandType:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="cmdText">SQL语句或存储过程</param>
        /// <returns>Datat:该命令的结果集</returns>
        public static DataSet ExecuteDataSet(string connString, CommandType cmdType, string cmdText)
        {
            return ExecuteDataSet(connString, cmdType, cmdText, (MySqlParameter[])null);
        }


        /// <summary>
        /// 为执行命令做好准备:打开数据库连接,命令语句,设置命令类型(SQL语句或存储过程),函数语取。
        /// </summary>
        /// <param name="cmd">SqlCommand 组件</param>
        /// <param name="conn">SqlConnection 组件</param>
        /// <param name="trans">SqlTransaction 组件,可以为null</param>
        /// <param name="cmdType">语句类型:CommandType.Text、CommandType.StoredProcedure</param>
        /// <param name="cmdText">SQL语句,可以为存储过程</param>
        /// <param name="cmdParms">SQL参数数组 private</param>
        public static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms)
        {

            if (conn.State != ConnectionState.Open)
                conn.Open();

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            if (trans != null)
                cmd.Transaction = trans;

            cmd.CommandType = cmdType;

            if (cmdParms != null)
            {
                foreach (MySqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }

        #endregion
    }
Tube_Z 2015-01-29
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
仔细看错误信息,是你MySqlClient里出了问题,跟SMTP有什么关系
http://bbs.csdn.net/topics/330076124 这个帖子里也是相同的问题. 他的就是释放 smtp的资源... 就解决了的.
於黾 2015-01-29
  • 打赏
  • 举报
回复
仔细看错误信息,是你MySqlClient里出了问题,跟SMTP有什么关系

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧