Что дано. Две работающие функции: Code: TcpClient clientSocket; Посылает объект: Code: public void SendObject(object obj) { IFormatter formatter = new BinaryFormatter(); NetworkStream strm = clientSocket.GetStream(); formatter.Serialize(strm, obj); strm.Flush(); } Принимает объект: Code: public object GetObject() { NetworkStream strm = clientSocket.GetStream(); IFormatter formatter = new BinaryFormatter(); object message = (object)formatter.Deserialize(strm); strm.Flush(); return message; } Как сделать чтобы объект объект был зашифрован? Вот что делал я. Должно работать, но не работает . Code: public void SendEncryptedObject( object obj) { DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider(); cryptic.Key = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH"); cryptic.IV = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH"); CryptoStream crStream = new CryptoStream(clientSocket.GetStream(), cryptic.CreateEncryptor(), CryptoStreamMode.Write); using (crStream) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(crStream, obj); } } public object GetEncryptedObject() { DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider(); cryptic.Key = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH"); cryptic.IV = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH"); object message; CryptoStream crStream = new CryptoStream(clientSocket.GetStream(), cryptic.CreateDecryptor(), CryptoStreamMode.Read); using (crStream) { IFormatter formatter = new BinaryFormatter(); message = (object)formatter.Deserialize(crStream); } return message; } Thrown: "The operation is not allowed on non-connected sockets." (System.InvalidOperationException) Exception Message = "The operation is not allowed on non-connected sockets.", Exception Type = "System.InvalidOperationException" Весь класс: Code: public class Message { TcpClient clientSocket; public Message() { } public Message(TcpClient c) { clientSocket = c; } public void Connect() { if (clientSocket != null) clientSocket.Close(); clientSocket = new TcpClient(); clientSocket.Connect("127.0.0.1", 8881); SendObject(new SystemInfo()); } public void Disconnect() { if (clientSocket != null) clientSocket.Close(); } public void SendObject(object obj) { IFormatter formatter = new BinaryFormatter(); NetworkStream strm = clientSocket.GetStream(); formatter.Serialize(strm, obj); strm.Flush(); } public object GetObject() { NetworkStream strm = clientSocket.GetStream(); IFormatter formatter = new BinaryFormatter(); object message = (object)formatter.Deserialize(strm); strm.Flush(); return message; } public void SendEncryptedObject( object obj) { DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider(); cryptic.Key = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH"); cryptic.IV = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH"); CryptoStream crStream = new CryptoStream(clientSocket.GetStream(), cryptic.CreateEncryptor(), CryptoStreamMode.Write); using (crStream) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(crStream, obj); } } public object GetEncryptedObject() { DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider(); cryptic.Key = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH"); cryptic.IV = ASCIIEncoding.ASCII.GetBytes("EZCZEZGH"); object message; CryptoStream crStream = new CryptoStream(clientSocket.GetStream(), cryptic.CreateDecryptor(), CryptoStreamMode.Read); using (crStream) { IFormatter formatter = new BinaryFormatter(); message = (object)formatter.Deserialize(crStream); } return message; } }
Указал бы на какой строчке Exception выбрасывается, верней где именно. Хотя исходя из ошибки и так все понятно, либо CryptoStream закрывает сокет и ты пытаешься его использовать(привет using), либо нет конекта(например сервер закрыл сокет) и GetStream() выбрасывает Exception(по моему опыту скажу что именно на GetStream() выбрасывается Exception с таким сообщениям). И да если юзаеш CryptoStream возможно еще надо будет делать FlushFinalBlock().