在 c# 中,通常只允许每个套接字地址(协议/网络地址/端口)使用一次

本文关键字:协议 端口 网络地址 一次 地址 套接字 许每个 | 更新日期: 2023-09-27 17:56:48

我正在尝试使用网络连接到传感器,传感器的 ip 是端口 192.168.2.44 端口 3000;

  try
        {
            byte[] byteReadStream = null; // holds the data in byte buffer
            IPEndPoint ipe = new IPEndPoint(IPAddress.Any,
                                            3000); //listen on all local addresses and 8888 port
            TcpListener tcpl = new TcpListener(ipe);
            while (true)
            {
                //infinite loop
                tcpl.Start(); // block application until data and connection
                TcpClient tcpc = tcpl.AcceptTcpClient();
                byteReadStream = new byte[tcpc.Available]; //allocate space
                tcpc.GetStream().Read(byteReadStream, 7000, tcpc.Available);
                Console.WriteLine(Encoding.Default.GetString(byteReadStream)
                                  + "'n")
                    ;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
            Console.ReadLine();
        }

我收到此错误:

Only one usage of each socket address (protocol/network address/port) is normally permitted 

我在插座上很新

在 c# 中,通常只允许每个套接字地址(协议/网络地址/端口)使用一次

看起来您每次都尝试打开端口只是为了阻止应用程序,直到数据可用。请勿尝试重新打开端口。而是让读取函数执行等待

等待 TcpClient 数据可用的最佳方法?

  byte[] reap = new byte[2048];
  var memStream = new MemoryStream();
      IPEndPoint ipe = new IPEndPoint(IPAddress.Any,
                                        3000); //listen on all local addresses and 8888 port
        TcpListener tcpl = new TcpListener(ipe);
 tcpl.Start(); // block application until data and connection
 TcpClient tcpc = tcpl.AcceptTcpClient();
  int bytesread = tcpc.GetStream().Read(resp, 0, resp.Length);
  while (bytesread > 0)
  {
      memStream.Write(resp, 0, bytesread);
      bytesread = tcpc.GetStream().Read(resp, 0, resp.Length);
  }

这个想法是你与流交互,而不是TcpClient。 然后尝试在每次 Go 中读取一些字节。当然,实际阅读量可能会更少。在我的示例中,我将结果放入内存流中。关键是不要在每个环路周期都尝试重新连接,因为您已经在以前的环路运行中打开了端口。

还要考虑使用此异步,除非您对线程在 Read 方法上被阻止感到满意。通常您还必须考虑优雅地关闭端口

虽然这将在此方法中修复您的代码,但由于这些原因,您可能会收到错误。我试着帮助你发现它们

  1. 此方法被多次调用或由多个线程调用。在方法的开头放置一些 Console.Writeline("这应该发生一次")以检测

  2. 端口
  3. 已打开!。使用"netstat -an"或某些端口监控产品来检测。我建议关闭视觉工作室并检查

  4. 您有一些自动测试可以打开计算机上的端口。