2017-01-10 2 views
0

J'ai écrit un programme pour communiquer avec TcpListener et TcpClients. Un programme peut être un destinataire ou un expéditeur. L'ordre du récepteur d'utiliser TcpListener's/TcpClient est analogue à la commande de l'expéditeur.

Sur mon ordinateur Windows 10, où j'ai écrit le code, le code fonctionne correctement, mais sur Windows 7, le code ne fonctionne pas.

Je reçois l'erreur suivante de l'expéditeur: Aucune connexion n'a pu être établie car la machine cible l'a refusée 127.0.0.1:8000.

Alors, quelle est la cause de ce problème? Est-ce que cela a à voir avec la vitesse de l'ordinateur, parce que la machine W10 a un i7 et W7 a un i5 plus ancien?

Voici le code de l'expéditeur:

Pourquoi la communication TCP entre les ports sur la machine locale ne fonctionne pas sur les différents systèmes d'exploitation Windows?

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

Première question: avez-vous vérifié l'existence d'un pare-feu ou d'autres programmes utilisant le port 8000? – Nico

+0

@Nico Je l'ai fait, mais rien n'a été fait. Sauf, même lorsque l'application n'est pas en cours d'exécution, j'obtiens le journal en utilisant netstat -a -b: 127.0.0.1:9125 Domen-PC: 8000 TIME_WAIT. Cela signifie-t-il quelque chose? –

Répondre

0

Je n'ai aucune connaissance en C#, mais je doute que cela ait quelque chose à voir avec le matériel de votre ordinateur. Je vérifierais les 2 choses suivantes:

  1. Quelqu'un est-il déjà en cours d'exécution Programm sur votre machine Windows 7 et l'écoute sur le port 8000? Pourrait être un serveur Web, un jeu, un logiciel tiers. Ou même une ancienne version de votre programme est déjà en cours d'exécution. Essayez de redémarrer l'ordinateur et vérifiez à nouveau.

  2. Un pare-feu est-il en cours d'exécution sur votre machine Windows? Peut être un pare-feu Windows ou un pare-feu installé par un programme antivirus.

0

* EDIT juste remarqué que votre commentaire ci-dessus TIMED_WAIT indique que le port est utilisé. A, Windows pare-feu, allez au défenseur et désactivez-le pour tester si cela fonctionne, si cela vous permet d'ajouter une exception et de le rallumer. B, Le port est en cours d'utilisation.

Un rapide recherché a révélé que l'utilisation:

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

travaillera de concert avec le pare-feu (Atleast à des fins de test) sur localhost, vous ouvrez votre ordinateur pour son compréhensible que vous devez explicitement dire à votre pare-feu que vous voulez pour ouvrir votre réseau!

0

Le port 8000 est plus que probablement utilisé par un autre programme. Surtout si cela fonctionne sur un ordinateur mais refuse activement sur un autre (un ordinateur peut avoir un programme installé que l'autre ne fait pas). Essayez un autre port (25568 par exemple)