【问题标题】:Error "Only one usage of each socket address (protocol/network address/port) is normally permitted"错误“每个套接字地址(协议/网络地址/端口)通常只允许使用一次”
【发布时间】:2016-02-02 05:23:25
【问题描述】:

我正在使用 socket/tcplistener 在windows application 中处理发送者和接收者。

我收到这个错误

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

StartReciever 方法的 catch 块中出现错误

下面是我的代码。

// On button click
private void btnLoadFile_SendFile_Click(object sender, EventArgs e)
      {

       StartReciever();
       SendData(tcpIpAddress, port, filename);
      }


  private void StartReciever()
        {
            util.LoadSettings();

            string tcpIpAddress = util.svrSettings["IpAddress"];
            string port = util.svrSettings["Port"];
            string outDir = util.svrSettings["isOutput"];

            new Thread(
        () =>
        {
            if (!File.Exists(util.settingFile))
                Logger("Please setup the services first.");
            else
            {
                try
                {
                    IPAddress ipAddress = IPAddress.Parse(tcpIpAddress);
                    TcpListener tcpListener = new TcpListener(ipAddress, Convert.ToInt32(port));

                    tcpListener.Start();

                    Logger("\nWaiting for a client to connect...");

                    //blocks until a client connects
                    Socket socketForClient = tcpListener.AcceptSocket();

                    Logger("\nClient connected");

                    //Read data sent from client
                    NetworkStream networkStream = new NetworkStream(socketForClient);
                    int bytesReceived, totalReceived = 0;

                    string fileName = "testing.txt";

                    byte[] receivedData = new byte[10000];
                    do
                    {
                        bytesReceived = networkStream.Read
                            (receivedData, 0, receivedData.Length);
                        totalReceived += bytesReceived;
                        Logger("Progress of bytes recieved: " + totalReceived.ToString());
                        if (!File.Exists(fileName))
                        {
                            using (File.Create(fileName)) { };
                        }

                        using (var stream = new FileStream(fileName, FileMode.Append))
                        {
                            stream.Write(receivedData, 0, bytesReceived);
                        }

                    }
                    while (bytesReceived != 0);
                    Logger("Total bytes read: " + totalReceived.ToString());

                    socketForClient.Close();
                    Logger("Client disconnected...");

                    tcpListener.Stop();
                }
                catch (Exception ex)
                {
                    // Error : "Only one usage of each socket address (protocol/network address/port) is normally permitted"     
                    Logger("There is some error: " + ex.Message); 
                }
            }
        }).Start();
        }



 private static void SendData(string tcpIpAddress, string port, string filename)
        {
            new Thread(
      () =>
      {
          TcpClient tcpClient = new TcpClient(tcpIpAddress, Convert.ToInt32(port));
          //const int bufsize = 8192;
          const int bufsize = 10000;
          var buffer = new byte[bufsize];
          NetworkStream networkStream = tcpClient.GetStream();

          using (var readFile = File.OpenRead(filename))
          {
              int actuallyRead;
              while ((actuallyRead = readFile.Read(buffer, 0, bufsize)) > 0)
              {
                  networkStream.Write(buffer, 0, actuallyRead);
              }
          }
      }).Start();
        }

【问题讨论】:

  • 请注意,当我第二次单击按钮时会发生错误。第一次点击不会引发任何错误
  • 每次单击按钮时都在初始化侦听器,因此第二次尝试抛出此异常。您应该只初始化和启动一次监听器。

标签: c# sockets tcplistener


【解决方案1】:

我的猜测是第一次单击按钮启动的接收器仍在运行,因此当您尝试在同一地址和端口上设置第二个 TcpListener 时,您会遇到异常。

您应该添加一些代码来阻止您并行创建两个相同的侦听器。

【讨论】:

  • 知道如何按照你的建议做同样的事情,因为我也在寻找同样的方法吗?
【解决方案2】:

您在 Click 事件处理程序中直接调用 StartReceiver 方法,这就是它第二次尝试打开相同端口的原因。它只需要被调用一次,把它移到别处,比如在你的程序初始化代码中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-03
    • 2017-06-09
    • 2011-01-15
    • 2010-12-26
    • 2010-11-23
    相关资源
    最近更新 更多