socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次

.Net技术 码拜 10年前 (2015-03-30) 3708次浏览 0个评论
 

服务器端用的是windows 2003 Server
        private void StartListening()
        {
            try
            {
                //指定的IP地址和端口上是否有传入的连接尝试
                myListener = new TcpListener(IPAddress.Parse(m_serverIP), int.Parse(m_serverPort));
                //监听启动
                myListener.Start();
                //添加说明信息到ListView
                AddListView(string.Format(“\r\n” + DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss”).ToString()
                                            + ” 开始在{0}:{1}监听客户端连接”, m_serverIP, m_serverPort));
                //监听客户端连接的线程
                Thread myThread = new Thread(ListenClientConnect);
                myThread.Start();
            }
            catch (Exception ex)
            {
                intListenFlag = 0;
                Utility.WriteToTxt(“ServerErrorLog.txt”, DateTime.Now.ToString() + “:StartListening ” + ex.Message);
                //重新启动本程序
                ReStartProgram();
            }
        }
程序运行几天后就报错
“socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次”
端口我是指定的3024, 让客户端去连接服务器端的3024端口,但是运行几天就会报错。

socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
2分
检查代码,看是否多次执行了StartListening
socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
10分
估计你的ReStartProgram这个流程没有把之前的socket关闭就重新绑定了端口
socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
10分
那就说明 3024  又一次被使用了。  catch捕获异常后,重新启动之前 没有释放端口。
socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
1分
ReStartProgram()这个方法看看有没有关闭socket
socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
1分
退出的时候,监听线程还在,所以没有完全关闭,把监听线程设置为后台线程。程序退出以后。监听线程也退出了。端口就不会被占用。
socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
1分
检查下是不是下面两种可能:
1、ReStartProgram();的时候,程序进程还在,这就导致出现两个运行的exe
2、代码里面多次调用了StartListening方法
socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
既然你这个代码里出现了ReStartProgram();
别的代码里说不定也出现了ReStartProgram();
所以你应该先测试当程序重启的时候是否就一定会发生这个错误
socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
15分
myListener = new TcpListener(IPAddress.Parse(m_serverIP), int.Parse(m_serverPort));  
myListener.Start();
myListener = new TcpListener(IPAddress.Parse(m_serverIP), int.Parse(m_serverPort));  
myListener.Start();
/pre>
执行2次 就报错..
所以你自己检查下逻辑吧
socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
经测试
在       

        /// 重新启动本程序
        /// </summary>
        private void ReStartProgram()
        {
            //通过停止监听让myListener.AcceptTcpClient()产生异常退出监听线程
            myListener.Stop() ;  //添加这句代码后就没问题了。
        
            。。。。。。。。。。
        }

在重启程序时,先关闭监听线程就好了,谢谢大家

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!