2015-11-02 37 views
0

我正在使用套接字/ tcplistener在发件人和接收方windows application上工作。错误“通常只允许使用每个套接字地址(协议/网络地址/端口)”

我正在此错误

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

误差在catch块来StartReciever方法

以下是我的代码。

// 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(); 
     } 
+0

请注意,当我第二次点击按钮时发生错误。第一次点击不会引发任何错误 – Gaurav123

+0

每次单击按钮时,您都在初始化侦听器,因此第二次尝试会抛出此异常。您只应初始化并启动侦听器一次。 –

回答

0

我的猜测是,接收器开始通过第一按钮单击仍在运行,所以当你试图建立第二个TcpListener在同一个地址和端口,你得到的异常。

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

+0

任何想法如何做你提出的相同,因为我正在寻找相同的? – Gaurav123

0

您可以在Click事件处理函数中调用StartReceiver方法,这就是为什么它会尝试第二次打开相同的端口。它只需要调用一次,将它移动到其他地方,比如在你的程序初始化代码中。

相关问题