2

我使用以下代码创建了一个 TCP 侦听器:

TCPListener = new TcpListener(IPAddress.Any, 1234);

我开始使用以下代码监听 TCP 设备:

TCPListener.Start();

但是在这里,我不控制端口是否正在使用中。当端口被使用时,程序给出一个异常:“每个套接字地址(协议/网络地址/端口)通常只允许使用一次。”。

我该如何处理这个异常?我想警告用户该端口正在使用中。

4

6 回答 6

5

放置一个 try/catch 块 TCPListener.Start();并捕获 SocketException。此外,如果您从程序中打开多个连接,那么最好在列表中跟踪您的连接并在打开连接之前查看您是否已经打开了连接

于 2012-05-23T12:14:54.470 回答
4

获取异常来检查端口是否在使用中并不是一个好主意。使用IPGlobalProperties对象获取对象数组TcpConnectionInformation,然后您可以查询端点 IP 和端口。

 int port = 1234; //<--- This is your value
 bool isAvailable = true;

 // Evaluate current system tcp connections. This is the same information provided
 // by the netstat command line application, just in .Net strongly-typed object
 // form.  We will look through the list, and if our port we would like to use
 // in our TcpClient is occupied, we will set isAvailable to false.
 IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
 TcpConnectionInformation[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpConnections();

 foreach (TcpConnectionInformation tcpi in tcpConnInfoArray)
 {
   if (tcpi.LocalEndPoint.Port==port)
   {
     isAvailable = false;
     break;
   }
 }

 // At this point, if isAvailable is true, we can proceed accordingly.

有关详细信息,请阅读内容。

为了处理异常,您将try/catch按照 habib 的建议使用

try
{
  TCPListener.Start();
}
catch(SocketException ex)
{
  ...
}
于 2012-05-23T12:20:36.217 回答
3

抓住它并显示您自己的错误消息。

检查异常类型并在 catch 子句中使用此类型。

try
{
  TCPListener.Start();
}
catch(SocketException)
{
  // Your handling goes here
}
于 2012-05-23T12:13:14.897 回答
2

把它放在一个try catch块里。

try {
   TCPListener = new TcpListener(IPAddress.Any, 1234);
   TCPListener.Start();

} catch (SocketException e) {
  // Error handling routine
   Console.WriteLine( e.ToString());
 }
于 2012-05-23T12:13:47.330 回答
2

使用 try-catch 块并捕获 SocketException。

try
{
  //Code here
}
catch (SocketException ex)
{
  //Handle exception here
}
于 2012-05-23T12:14:00.310 回答
1

好吧,考虑到您正在谈论异常情况,只需使用合适的块处理该异常try/catch,并告知用户一个事实。

于 2012-05-23T12:13:23.633 回答