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();
}
Première question: avez-vous vérifié l'existence d'un pare-feu ou d'autres programmes utilisant le port 8000? – Nico
@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? –