2017-01-10 18 views
0

私はTcpListenerとTcpClientsと通信するためのプログラムを書いています。プログラムは受信者または送信者になることができます。 TcpListenerの/ TcpClientを使用する受信者の順序は、送信者の順序に類似しています。

コードを書いた私のWindows 10マシンでは、コードは正常に動作しますが、Windows 7マシンではコードが機能しません。

送信者から次のエラーが発生します。ターゲットマシンが積極的に127.0.0.1:8000を拒否したため、接続できませんでした。

この問題の原因は何ですか? W10マシンにはi7があり、W7には古いi5が搭載されているため、コンピュータの速度に関係しますか?ここで

は、送信者のコードです:

ローカルマシン上のポート間のTCP通信が異なるWindows OSで動作しないのはなぜですか?

private void sendingThreadFunction() 
     { 
      try 
      { 
       using (ECDiffieHellmanCng sendingMode = new ECDiffieHellmanCng()) 
       { 
        using (TextReader reader = File.OpenText("sendersReceivingPort.txt")) 
        { 
         sendersReceivingPort = int.Parse(reader.ReadLine()); 
         sendersReceivingPort++; 
        } 
        using (StreamWriter sw = new StreamWriter("sendersReceivingPort.txt")) 
        { 
         sw.WriteLine(sendersReceivingPort.ToString()); 
        } 
        sendingMode.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash; 
        sendingMode.HashAlgorithm = CngAlgorithm.Sha256; 
        sendersPublicKey = sendingMode.PublicKey.ToByteArray(); 


        IPEndPoint ipLocalEndPoint = new IPEndPoint(IPAddress.Parse(ipAddress), sendersReceivingPort); 


        sendingSendPublicKeyNotification = new TcpClient(ipLocalEndPoint); 
        sendingSendPublicKeyNotification.Connect(IPAddress.Parse(ipAddress), receiversReceivingPort); 
        NetworkStream dataStreamNotification = sendingSendPublicKeyNotification.GetStream(); 
        byte[] notification = Encoding.UTF8.GetBytes("#PK"); 
        dataStreamNotification.Write(notification, 0, notification.Length); 
        dataStreamNotification.Close(); 
        sendingSendPublicKeyNotification.Close(); 

        Thread.Sleep(400); 

        sendingPublicKey = new TcpClient(); 
        sendingPublicKey.Connect(IPAddress.Parse(ipAddress), receiversReceivingPort); 
        NetworkStream dataStreamPublicKey = sendingPublicKey.GetStream(); 
        dataStreamPublicKey.Write(sendersPublicKey, 0, sendersPublicKey.Length); 
        dataStreamPublicKey.Close(); 
        sendingPublicKey.Close(); //poslje public key 

        Thread.Sleep(400); 

        sendingReceivePublicKeyListener = new TcpListener(IPAddress.Parse(ipAddress), sendersReceivingPort); 
        sendingReceivePublicKeyListener.Start(); 

        sendingReceivePublicKeyNotificationClient = sendingReceivePublicKeyListener.AcceptTcpClient(); 
        NetworkStream dataStreamReceivedNotification = sendingReceivePublicKeyNotificationClient.GetStream(); 
        byte[] notificationReceived = new byte[3]; 
        dataStreamReceivedNotification.Read(notificationReceived, 0, notificationReceived.Length); 
        dataStreamReceivedNotification.Close(); 
        sendingReceivePublicKeyListener.Stop(); 

        if(Encoding.UTF8.GetString(notificationReceived) != "#PK") 
        { 
         senderMode.Join(); 
        } 


        sendersListener = new TcpListener(IPAddress.Parse(ipAddress), sendersReceivingPort); 
        sendersListener.Start(); 

        sendersNewClient = sendersListener.AcceptTcpClient(); 
        NetworkStream dataStreamReceive = sendersNewClient.GetStream(); 
        byte[] receiversPublicKey = new byte[1024]; 
        dataStreamReceive.Read(receiversPublicKey, 0, receiversPublicKey.Length); 
        dataStreamReceive.Close(); 
        receiversPublicKey = Decode(receiversPublicKey); 
        sendersListener.Stop(); //prejmemo prejemnikov public key 


        CngKey secretKey = CngKey.Import(receiversPublicKey, CngKeyBlobFormat.EccPublicBlob); 
        sendersKey = sendingMode.DeriveKeyMaterial(CngKey.Import(receiversPublicKey, CngKeyBlobFormat.EccPublicBlob)); 




        byte[] encryptedFile = null; 
        byte[] ivFile = null; 
        byte[] fileBytes = File.ReadAllBytes(fileToSendPath); 
        Encryption(sendersKey, fileBytes, out encryptedFile, out ivFile); 

        byte[] encryptedFD = null; 
        byte[] ivFD = null; 
        byte[] fdInformation = Encoding.UTF8.GetBytes("#FD|" + fileToSendName + "|" + encryptedFile.Length.ToString()); 
        Encryption(sendersKey, fdInformation, out encryptedFD, out ivFD); // kriptira podatke o datoteki 

        sendingFD = new TcpClient(); 
        sendingFD.Connect(IPAddress.Parse(ipAddress), receiversReceivingPort); 
        NetworkStream dataStreamFD = sendingFD.GetStream(); 
        var mergedFDData = new byte[ivFD.Length + encryptedFD.Length]; 
        ivFD.CopyTo(mergedFDData, 0); 
        encryptedFD.CopyTo(mergedFDData, ivFD.Length); 
        dataStreamFD.Write(mergedFDData, 0, mergedFDData.Length); 
        dataStreamFD.Close(); 
        sendingFD.Close(); 

        Thread.Sleep(400); 

        sendingFile = new TcpClient(); 
        sendingFile.Connect(IPAddress.Parse(ipAddress), receiversReceivingPort); 
        NetworkStream dataStreamFile = sendingFile.GetStream(); 
        var mergedFileData = new byte[ivFile.Length + encryptedFile.Length]; 
        ivFile.CopyTo(mergedFileData, 0); 
        encryptedFile.CopyTo(mergedFileData, ivFile.Length); 
        dataStreamFile.Write(mergedFileData, 0, mergedFileData.Length); 
        dataStreamFile.Close(); 
        sendingFile.Close(); //poslje file 
       } 
      } catch(Exception e) 
      { 
       MessageBox.Show("Sender - " + e.Message); 
       senderMode.Join(); 
      } 
      senderMode.Join(); 
     } 
+0

最初の質問は、ファイアウォールやその他のプログラムがポート8000​​を利用しているかどうかを確認したことですか? – Nico

+0

@Nico私はしましたが、何も現れませんでした。を除いて、アプリケーションが実行されていない場合を除いて、netstat -a -b:127.0.0.1:9125 Domen-PC:8000 TIME_WAITを使用してログを取得します。それは何か意味ですか? –

答えて

0

私はC#について知識がありませんが、あなたのコンピュータのハードウェアと関係があるのか​​疑問です。 私は、次の2つのことをチェックします:

  1. どんなのprogrammは、すでにお使いのWindows 7のマシン上で実行されているし、ポート8000​​でリッスンしているの? Webサーバー、ゲーム、サードパーティーのソフトウェアである可能性があります。あるいは、既に動作している古いバージョンのプログラムでさえも。コンピュータを再起動し、再度確認してください。

  2. Windowsマシンではファイアウォールは実行されていますか? Windowsファイアウォールまたはウイルス対策プログラムによってインストールされたファイアウォールである可能性があります。

0

* EDITちょうどTIMED_WAIT上記のコメントは、ポートが使用中であることを示して気づきました。

A、Windowsファイアウォール、防御側に移動し、動作しているかどうかをテストするために電源を切ってください。そうであれば、例外を追加して再びオンにすることができます。 B、ポートが使用中です。

検索迅速に使用していることを明らかにした:

IPEndPoint ipLocalEndPoint = new IPEndPoint(IPAddress.Loopback, sendersReceivingPort); 

がファイアウォールで動作します(Atleastのは、テスト目的のために)ローカルホスト上の、あなたは明示的にしたいファイアウォールを伝えなければならないこと、その理解しやすいように、コンピュータを開いていますあなたのネットワークを開く!

0

ポート8000​​は他のプログラムによって使用されている可能性があります。特に1台のコンピュータでは動作しますが、別のコンピュータでは積極的に使用を拒否すると1台のコンピュータに別のプログラムがインストールされている可能性があります。別のポート(たとえば25568)を試してください

関連する問題