c# - 有什么方法可以检查套接字连接是否可用?
问题描述
我有以下代码:
class MyServer
{
TcpListener myList;
Socket socket;
public MyServer(string ip)
{
this.myList = new TcpListener(ip, 12001);
this.myList.Start();
Thread t = new Thread(new ThreadStart(GetConnection));
t.Start();
}
public void GetConnection()
{
try
{
socket = myList.AcceptSocket(); //(1)
}
catch
{
Console.WriteLine("Error");
}
}
public void StopListening()
{
this.myList.Stop();
}
}
它运行良好:我启动服务器,如果我“后悔”我调用 StopListening() (在建立连接之前!)并且因为我关闭了 myList,(1)失败了。
有没有办法在没有 try{}catch{} 的情况下编写此代码 - 将 GetConnection() 重写为:
public void GetConnection()
{
while ( myList is open && there is no connection)
{
//do nothing
}
if (myList is open)
{
this.socket = myList.AcceptConnection();
}
}
或其他方式?谢谢。
解决方案
socket = myList.AcceptSocket()
是一个阻塞调用,因此如果底层套接字停止侦听,它将引发异常,因此无论如何您都需要尝试/捕获该阻塞调用。
你可以测试:
if (myList.Server.IsBound)
{
this.socket = myList.AcceptConnection();
}
这样,除非套接字正在主动侦听,否则您不会阻塞下一个连接。但是就像我说的,如果您希望程序能够在某个时候停止侦听,那么当您调用时这仍然会引发异常myList.Stop()
推荐阅读
- java - GET 请求的参数被放入 URL 的查询字符串中。在 POST 请求中,它们位于请求正文中,那么 URL 是什么样的?
- ios - 在 UICollectionView 中加载第一个单元格之前获取 UICollectionViewCell
- java - 西蒙说按下按钮后按钮颜色不会恢复正常
- javascript - jQuery UI datepicker 和对话框未定义的第一次点击
- nginx - Nginx 上的 Modsecurity modsecurity.conf-recommended Source Not Found
- mysql - phpmyadmin mysql docker 简单链接
- ecmascript-6 - es6 导入:命名导入的变量
- javascript - 将路径数组转换为唯一路径数组
- php - 根据列值对 JSON API 进行分类
- elasticsearch - Elasticsearch:获取每个结果中匹配的术语列表