首页 新闻 搜索 专区 学院

C#中在一个方法内的负责监听端口的局部变量serverScoket在方法结束后,为什么还能继续监听端口?

0
悬赏园豆:50 [已解决问题] 解决于 2016-02-09 10:57

我在winform中的按钮点击事件中新建了一个局部变量serveScoket,开启监听,在方法结束后,我新建一个客户端连接仍然可以连接到服务器,这是为什么?

 private void btnStart_Click(object sender, EventArgs e)
        {
            Socket server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            server.Bind(new IPEndPoint(IPAddress.Parse(txtIP.Text.Trim()),int.Parse(txtPort.Text.Trim())));
            server.Listen(10);
            txtReciveMsg.Text = "服务器开始监听...\r\n" + txtReciveMsg.Text;
        }

陌影的主页 陌影 | 初学一级 | 园豆:152
提问于:2015-08-28 10:27
< >
分享
最佳答案
0

因为 Socket是 “非托管”资源。 就是说,在.net框架中 的垃圾回收机制,是对这个对象不起作用的。

 

所以 说,你的方法结束了,它还不会自动消失。

 

非托管 资源需要你调用 它 释放自己的方法

收获园豆:15
田麦成 | 小虾三级 |园豆:1984 | 2015-08-28 16:36
其他回答(4)
0

这让人怎么回答呢?如果真的是侦听一次,那么你在做网络程序的时候,你要一直点击按钮?

收获园豆:5
顾晓北 | 园豆:10087 (专家六级) | 2015-08-28 10:39

额。。我是不懂为什么局部变量释放后还能继续监听。。。

如果把这个serverSocket是类的全局变量或者成员变量才能监听,就没什么疑问了

支持(0) 反对(0) 陌影 | 园豆:152 (初学一级) | 2015-08-28 10:43
0

因为这是一个异步方法,socket也有同步的方法,我之前用过。如果你不想让它监听了,把它close就好了。socket属于com组件类的,不会自动释放,需要手动回收。

收获园豆:10
空明流光 | 园豆:62 (初学一级) | 2015-08-28 10:45

我想它应该可以用using来声明的

支持(0) 反对(0) 空明流光 | 园豆:62 (初学一级) | 2015-08-28 10:46
0

你有没有测试过,方法结束后经过多少时间间隔客户端没法连接到服务器了?

收获园豆:10
Launcher | 园豆:45045 (高人七级) | 2015-08-28 11:03

只要服务器程序不退出,就一直可以连接的

支持(0) 反对(0) 陌影 | 园豆:152 (初学一级) | 2015-08-28 14:47

@陌影: 在 Listen 后调用 server.Dispose()。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2015-08-28 14:57
0

它是一个线程,即使退出了,它还在后台运行的。

收获园豆:10
猿哥爱码 | 园豆:258 (菜鸟二级) | 2015-08-28 12:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册