私は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();
}
最初の質問は、ファイアウォールやその他のプログラムがポート8000を利用しているかどうかを確認したことですか? – Nico
@Nico私はしましたが、何も現れませんでした。を除いて、アプリケーションが実行されていない場合を除いて、netstat -a -b:127.0.0.1:9125 Domen-PC:8000 TIME_WAITを使用してログを取得します。それは何か意味ですか? –