Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Нет ответа по TCP. помогите!

33K
21 мая 2008 года
Padavan1
15 / / 07.05.2008
Доброго времени суток!
Вопрос вот в чем, устанавливаю соединение по TCP (TcpClient) с использованием SSL (SslStream). Соединение устанавливается, аутенфикация проходит нормально, данные отправляются тоже нормально... но вот ответа от сервера я так и не получаю...
Общался со стороной сервера, там мне сказали, что при попытке послать мне ответ у них возникает ошибка, что порт закрыт. Может кто встречался с подобной проблемой?

Код:
public static string GetResponse(string  message, ConfigInfo cfg)
        {
            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();
        }


Буду благодарен за любую помощь!
241
21 мая 2008 года
Sanila_san
1.6K / / 07.06.2005
Попробуйте взять анализатор пакетов (например, wireshark) и сделать дамп сетевого обмена. Там можно будет выяснить, кто куда шлёт данные, и где закрывается порт. Правда, с этим дампом тоже надо будет разбираться, но картина станет более ясной. Попробуйте выключить SSL. В конце концов, напишите сервер с необходимой функциональностью, чтобы тестировать было проще. Сейчас мне думается, что связь просто отваливается по таймауту. Дамп в студию. :)
241
21 мая 2008 года
Sanila_san
1.6K / / 07.06.2005
Кстати, каким образом происходит отправка ответа со стороны сервера?
33K
21 мая 2008 года
Padavan1
15 / / 07.05.2008
Не совсем понял прот "дамп"...
Как отправляются данные с сервера я не знаю, тк это делается на стороне клиента...
Есть еще такой момент, что переодически кончается timeout и приложение вылетает в exception, а бывает, что просто в ответ приходит 0 байт (serverMessage - пустая строка)...
33K
21 мая 2008 года
Padavan1
15 / / 07.05.2008
Ssl отключить не могу, тк тогда меня просто не пустит на их сервер... На них вроде тоже грешить нечего, тк мы не первые, кто с ними работает и на сколько я понимаю у них все ок.
241
23 мая 2008 года
Sanila_san
1.6K / / 07.06.2005
Цитата:
Не совсем понял прот "дамп"...

Это байты сетевого трафика, сохранённые в файле для последующего анализа. Подходящий инструмент лежит на http://www.wireshark.org. Без знания того, какие пакеты проходят в сети, очень трудно отладить сетевое приложение, даже если оно пишется при помощи Raw Sockets. Уровень абстракции не позволяет.

Цитата:
Есть еще такой момент, что переодически кончается timeout и приложение вылетает в exception, а бывает, что просто в ответ приходит 0 байт (serverMessage - пустая строка)...

Это всё признаки того, что сокет закрывается по таймауту. Этот параметр надо регулировать сообразно здравому смыслу и настройкам приложения/протокола на том конце линии связи. Как правило, пустая строка свидетельствует о том, что таймаут истёк. при попытке прочитать закытый сокет возникает исключение. Вывод: увеличить таймаут до нужного значения.

Цитата:
Как отправляются данные с сервера я не знаю, тк это делается на стороне клиента...

Не понял. А разве сложно узнать? Протокол ТСР стандартен и везде реализован практически одинаково. Высокоуровневые протоколы описаны. В чём проблема?

Цитата:
Ssl отключить не могу, тк тогда меня просто не пустит на их сервер...

Так я ж не зря посоветовал написать собственный простой сервер для тестирования.;)

Кстати, можно чуть более подробно поведать о том, как и что вы делаете?

33K
27 мая 2008 года
Padavan1
15 / / 07.05.2008
поставил WireShark, какие то данные от них вроде приходят, но вот что именно и почему не читаются в SslStream.Read() я не понимаю...

Цитата:
Кстати, можно чуть более подробно поведать о том, как и что вы делаете?



не понял, что именно подробнее?

Еще такой момент, пока бродил по интернету в поисках решения переодически натыкался на использование разнообразных ридеров (streamreader, streamwriter и тд), вместо стандартного SslStream.Read()... может в этом дело?

241
27 мая 2008 года
Sanila_san
1.6K / / 07.06.2005
Цитата:
поставил WireShark, какие то данные от них вроде приходят, но вот что именно и почему не читаются в SslStream.Read() я не понимаю...

Если уж совсем непонятно, пришлите мне дамп, я помогу разобраться.

Цитата:
не понял, что именно подробнее?

Суть вопроса в том, чтобы понять, какая высокоуровневая задача перед вами стоит. Судя по всему, вы плохо разбираетесь в работе с сетью, и вполне может быть, что выбираете неоправданно сложное архитектурное решение.

Цитата:
в поисках решения переодически натыкался на использование разнообразных ридеров (streamreader, streamwriter и тд), вместо стандартного SslStream.Read()... может в этом дело?

Если есть время - экспериментируйте и вдумчиво читайте MSDN в подлиннике, и книжку Винода Кумара о работе с сетью в .NET. "Навскидку", не зная условий стоящей задачи, на такой вопрос ответить почти невозможно.

33K
27 мая 2008 года
Padavan1
15 / / 07.05.2008
Цитата:
Если уж совсем непонятно, пришлите мне дамп, я помогу разобраться.


может дадите имейл я вам файлик скину?

Цитата:
Суть вопроса в том, чтобы понять, какая высокоуровневая задача перед вами стоит. Судя по всему, вы плохо разбираетесь в работе с сетью, и вполне может быть, что выбираете неоправданно сложное архитектурное решение.



задача такова:
по протоколу SSL v2/v3 отправляется запрос (xml), после после получения ответа (xml) совершаются аналогичные действия в зависимости от ответа.

Цитата:
Если есть время - экспериментируйте и вдумчиво читайте MSDN в подлиннике, и книжку Винода Кумара о работе с сетью в .NET. "Навскидку", не зная условий стоящей задачи, на такой вопрос ответить почти невозможно.



Пробовал различные ридеры, но пока безуспешно... никто из них просто ничего не получает... таймаут поставил 2мин, но "пустой" ответ приходит примерно через 1 мин, exception не вылетает...

241
27 мая 2008 года
Sanila_san
1.6K / / 07.06.2005
Цитата:
Пробовал различные ридеры, но пока безуспешно... никто из них просто ничего не получает... таймаут поставил 2мин, но "пустой" ответ приходит примерно через 1 мин, exception не вылетает...

Тогда попробуйте написать эхо-сервер, и поработайте с ним. во всяком случае разберётесь с приёмом сигналов.

1.7K
10 июля 2008 года
alektrik
140 / / 16.01.2006
Ну во первых лучше всё операции чтения/записи делать асинхронно (гораздо удобнее), тобишь sslStream.BeginRead(...)
Во вторых у тебя не вижу закрытия sslStream'a, перез закрытием клиента необходимо закрыть поток. (MSND)
Эт так пожелание ;-)

С чего ты взыл что данные доходят??? мож действительно доходят... но в неправильном формате...
Можеш выложить весь код??? или хотябы как происходит отправка данных еще, а не только прием...
33K
10 июля 2008 года
Padavan1
15 / / 07.05.2008
Спасибо за ответ, но ситуация уже разрешилась.
Код, кстати, был в порядке, косяк был на "их" стороне, они не могли сообщение разобрать и отсылали пустое сообщение...
вобщем сейчас все гут)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог