public static string GetResponse(string message, ConfigInfo cfg)
{[INDENT] TcpClient tcpClient = new TcpClient(cfg.GWAddress, int.Parse(cfg.GWPort));
SslStream sslStream = new SslStream(
tcpClient.GetStream(),
false,
ValidateServerCertificate,
SelectLocalCertificate);
// The server name must match the name on the server certificate.
try
[/INDENT][INDENT] {[INDENT] X509Certificate cert =new X509Certificate(CertPath,CertPsw);
X509CertificateCollection cerCol=new X509CertificateCollection();
cerCol.Add(cert);
sslStream.AuthenticateAsClient(cfg.GWAddress,cerCol,SslProtocols.Ssl3,false);
[/INDENT]}
catch (AuthenticationException e)
{[INDENT] Console.WriteLine("Exception: {0}", e.Message);
if (e.InnerException != null)
[/INDENT]{
Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
}[INDENT] Console.WriteLine("Authentication failed - closing the connection.");
tcpClient.Close();
return null;
[/INDENT]}
// Encode a test message into a byte array.
byte[] messsage = Encoding.UTF8.GetBytes(message);
sslStream.Write(messsage);
sslStream.Flush();
// Read message from the server.
string serverMessage = ReadMessage(sslStream);
Console.WriteLine("Server says: {0}", serverMessage);
// Close the client connection.
tcpClient.Close();
Console.WriteLine("Client closed.");
return serverMessage;
[/INDENT]}
static string ReadMessage(SslStream sslStream)
{
byte[] buffer = new byte[2048];
StringBuilder messageData = new StringBuilder();
int bytes = -1;
sslStream.ReadTimeout =60000;
// Use Decoder class to convert from bytes to UTF8
// in case a character spans two buffers.
do
{
bytes = sslStream.Read(buffer, 0, buffer.Length);
// Use Decoder class to convert from bytes to UTF8
// in case a character spans two buffers.
Decoder decoder = Encoding.UTF8.GetDecoder();
char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
decoder.GetChars(buffer, 0, bytes, chars, 0);
messageData.Append(chars);
// Check for EOF.
//if (messageData.ToString().IndexOf("<EOF>") != -1)
//{
// break;
//}
} while (bytes != 0);
return messageData.ToString();
}
SSL и TCP
Необходимо реализовать соединение с сервером с использованием SSL.
Реализую это на основе TcpClient и SslStream. На сколько я понимаю прием достаточно распространенный и проблем особых возникнуть вроде как не должно... но столкнулся с такой проблемой: соединение устанавливается нормально, аутентификация проходит тоже нормально, данные на сервер отправляются без проблем, НО ответ от сервера не приходит... точнее приходит, но пустой. Общался с "другой стороной" (сервер), там сказали, что от меня они запрос получают нормально, но при попытке ответить мне сессия отключается... вот как то вот так...
код был почти полностью списан с msdn
буду благодарен любым мыслям, тк самому найти косяк не получается
Код в студию!
причем отправка идет нормально, а когда получаю ответ он либо ждет до таймаута и вылетает в Exception либо просто получает 0 байт.