Нет ответа по TCP. помогите!
Вопрос вот в чем, устанавливаю соединение по TCP (TcpClient) с использованием SSL (SslStream). Соединение устанавливается, аутенфикация проходит нормально, данные отправляются тоже нормально... но вот ответа от сервера я так и не получаю...
Общался со стороной сервера, там мне сказали, что при попытке послать мне ответ у них возникает ошибка, что порт закрыт. Может кто встречался с подобной проблемой?
{
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
{
X509Certificate cert =new X509Certificate(cfg.CertFilePath,cfg.CertFilePSw);
X509CertificateCollection cerCol=new X509CertificateCollection();
cerCol.Add(cert);
sslStream.AuthenticateAsClient(cfg.GWAddress,cerCol,SslProtocols.Ssl3,false);
}
catch (AuthenticationException e)
{
Console.WriteLine("Exception: {0}", e.Message);
if (e.InnerException != null)
{
Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
}
Console.WriteLine("Authentication failed - closing the connection.");
tcpClient.Close();
return null;
}
// Encode a test message into a byte array.
// Read message from the server.
sslStream.ReadTimeout = 60000;
string serverMessage = ReadMessage(sslStream);
// Close the client connection.
tcpClient.Close();
//Console.WriteLine("Client closed.");
return serverMessage;
}
static string ReadMessage(SslStream sslStream)
{
// Read the message sent by the server.
// The end of the message is signaled using the
// "<EOF>" marker.
byte[] buffer = new byte[2048];
StringBuilder messageData = new StringBuilder();
int bytes = -1;
// 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();
}
Буду благодарен за любую помощь!
Как отправляются данные с сервера я не знаю, тк это делается на стороне клиента...
Есть еще такой момент, что переодически кончается timeout и приложение вылетает в exception, а бывает, что просто в ответ приходит 0 байт (serverMessage - пустая строка)...
Это байты сетевого трафика, сохранённые в файле для последующего анализа. Подходящий инструмент лежит на http://www.wireshark.org. Без знания того, какие пакеты проходят в сети, очень трудно отладить сетевое приложение, даже если оно пишется при помощи Raw Sockets. Уровень абстракции не позволяет.
Это всё признаки того, что сокет закрывается по таймауту. Этот параметр надо регулировать сообразно здравому смыслу и настройкам приложения/протокола на том конце линии связи. Как правило, пустая строка свидетельствует о том, что таймаут истёк. при попытке прочитать закытый сокет возникает исключение. Вывод: увеличить таймаут до нужного значения.
Не понял. А разве сложно узнать? Протокол ТСР стандартен и везде реализован практически одинаково. Высокоуровневые протоколы описаны. В чём проблема?
Так я ж не зря посоветовал написать собственный простой сервер для тестирования.;)
Кстати, можно чуть более подробно поведать о том, как и что вы делаете?
не понял, что именно подробнее?
Еще такой момент, пока бродил по интернету в поисках решения переодически натыкался на использование разнообразных ридеров (streamreader, streamwriter и тд), вместо стандартного SslStream.Read()... может в этом дело?
Если уж совсем непонятно, пришлите мне дамп, я помогу разобраться.
Суть вопроса в том, чтобы понять, какая высокоуровневая задача перед вами стоит. Судя по всему, вы плохо разбираетесь в работе с сетью, и вполне может быть, что выбираете неоправданно сложное архитектурное решение.
Если есть время - экспериментируйте и вдумчиво читайте MSDN в подлиннике, и книжку Винода Кумара о работе с сетью в .NET. "Навскидку", не зная условий стоящей задачи, на такой вопрос ответить почти невозможно.
может дадите имейл я вам файлик скину?
задача такова:
по протоколу SSL v2/v3 отправляется запрос (xml), после после получения ответа (xml) совершаются аналогичные действия в зависимости от ответа.
Пробовал различные ридеры, но пока безуспешно... никто из них просто ничего не получает... таймаут поставил 2мин, но "пустой" ответ приходит примерно через 1 мин, exception не вылетает...
Тогда попробуйте написать эхо-сервер, и поработайте с ним. во всяком случае разберётесь с приёмом сигналов.
Во вторых у тебя не вижу закрытия sslStream'a, перез закрытием клиента необходимо закрыть поток. (MSND)
Эт так пожелание ;-)
С чего ты взыл что данные доходят??? мож действительно доходят... но в неправильном формате...
Можеш выложить весь код??? или хотябы как происходит отправка данных еще, а не только прием...
Код, кстати, был в порядке, косяк был на "их" стороне, они не могли сообщение разобрать и отсылали пустое сообщение...
вобщем сейчас все гут)