Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение длины сообщения в потоке NteworkStream 
V
    Опции темы
XavierElf
Дата 10.4.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: нет
Всего: 1



Возникла такая проблема: не могу получить длину сообщения во входном потоке от сервера. делаю так:
Код

Byte [] _streamData = new Byte[_nwStream.Length];

В результате пишет: "Этот поток не поддерживает операций поиска."

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

Ой, прошу прощения! Запостил не в тот раздел... Модераторы переместите пожалуйста в "распределённые приложения и сети".

Это сообщение отредактировал(а) XavierElf - 10.4.2007, 14:24
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
tol05
Дата 10.4.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 6
Всего: 170



Почитал пост и самому интересно стало.
Похоже, ситуация дейсвительно печальна. Не поддерживается.
Вот накопал кое-что по этому поводу.
http://csharpcomputing.com/Tutorials/faq.htm
Цитата

What is the difference between BaseStream class and NetworkStream class?
BaseStream is mainly used to work with files that have a fixed length. It, therefore, supports such methods as Peek() and Length. NetworkStream is used to manage network stream and has no way of saying what the size of the stream is. You will need to use timeouts to decide when an application needs to stop reading data from the NetworkStream.


http://www.vbforums.com/archive/index.php/t-384913.html 3 последние поста

Я бы лично сделал все-таки буфер конкретной длины и заполнял бы его периодически, с проверкой на заполнение.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Naum
Дата 10.4.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: нет
Всего: 15



При работе с потоками частенько используются т.н. буфер. У буфера обычно определен размер. По-этому для твоего случая я могу порекомендовать только воспользоваться буфером.
Цитата(MSDN)

    byte[] myReadBuffer = new byte[1024];
    StringBuilder myCompleteMessage = new StringBuilder();
    int numberOfBytesRead = 0;

    // Incoming message may be larger than the buffer size.
    do{
         numberOfBytesRead = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length);

         myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
                         
    }
    while(myNetworkStream.DataAvailable);

http://msdn2.microsoft.com/en-us/library/s...tream.read.aspx
Только вместо добавления в строку тебе нужно реализовать добавление в твой массив _streamData. Ну и есессно. myNetworkStream => _nwStream. smile

Добавлено через 2 минуты и 51 секунду
Тьфу, опять не сразу понял суть вопроса. Но решение, ИМХО, все равно правильное?

Это сообщение отредактировал(а) Naum - 10.4.2007, 14:53


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
XavierElf
Дата 10.4.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: нет
Всего: 1



Дело в том, что я делаю прогу, которая работает с протоколом IRC. Соответственно длина потока варьируется в зависимости от размера сообщения, которое присылает сервер. А если, к примеру, кто-то отправил сообщение длиной допустим символов 500-1000? Плюс к этому добавить количество дополнительных символов, которыми сервер дополняет это сообщение?
Пример такого сообщения:
Код

:[email protected] PRIVMSG Wiz :<текст сообщения от Angel>

--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
tol05
Дата 10.4.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 6
Всего: 170



Так в чем проблема? Пример Naum-а это учитывает.
Читаешь из потока 1024 байт, сохраняешь их в строке, смотришь, есть ли еще данные для чтения, если да - читаешь снова
и .т.д. smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
XavierElf
Дата 10.4.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: нет
Всего: 1



Всем пасибо! Сделал так:
Код

private void ListenIRCServer()
{
   StringBuilder msg;
   int bytes;
   do
   {
      _streamData = new Byte[4096];
      msg = new StringBuilder();
      bytes = 0;
      try
      {
         while(_IRCStream.DataAvailable)
         {
            bytes = _IRCStream.Read(_streamData, 0, _streamData.Length);
            msg.AppendFormat("{0}", Encoding.Default.GetString(_streamData, 0, bytes));
            if (!_IRCStream.DataAvailable)
               this.AddString(msg.ToString());
         }
      }
      catch(Exception e)
      {
         MessageBox.Show(e.Message.ToString(), "Error");
      }
      Thread.Sleep(1);
   } while(true);
}


--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
XavierElf
Дата 10.4.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: нет
Всего: 1



Извиняюсь перед модераторами, но есть ещё один вопрос и он также касается этой темы. В общем, мне нужно, чтобы по нажатию кнопки "дисконнект" завершалось соединение с сервером. Сделал таким образом:
Код

if (_IRCThread.IsAlive)
{
   try
   {
      if (_IRCThread.ThreadState != ThreadState.Aborted)
         _IRCThread.Abort();
   }
   catch (Exception ex)
   {
      MessageBox.Show(ex.Message.ToString(), "Error");
   }
}
      if (_IRCClient.Connected)
      {
         try
         {
             _IRCClient.Close();
         }
         catch (Exception clex)
         {
            MessageBox.Show(thex.Message.ToString(), "Error");
         }
}

Однако возникла проблема в том, что когда нажимаю на неё (кнопку), постоянно вылезает сообщение: "Поток находится в процессе прерывания". Хотя я установил его бит IsBackground в true. Что не так?
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
XavierElf
Дата 13.4.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: нет
Всего: 1



up
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
mr.DUDA
Дата 14.4.2007, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 2
Всего: 232



Одного только вызова Abort недостаточно - будет ждать до посинения. Нужно:

Код

      if (_IRCThread.ThreadState != ThreadState.Aborted)
      {
         _IRCThread.Abort();
         _IRCThread.Join(0);
      }


Тогда обрубит сразу.

P.S.
Модератор: Пожалуйста, один топик - один вопрос. Не надо подымать тему в надежде что кто-то прокрутит до 2-го, 3-го и т.п. вопросов, и даст ответ.


--------------------
user posted image
PM MAIL WWW   Вверх
XavierElf
Дата 16.4.2007, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: нет
Всего: 1



Спасибо!
 smile Только, чесно говоря, я не понимаю, почему два близких по теме вопроса нельзя объединить в одну тему... В конце концов, это может сильно уменьшить количество новых тем и облегчить поиск ответов на вопросы тем, у кого возникают подобные вопросы, ведь зачастую бывает, что у них могут возникнуть по очереди сначала один, потом другой вопрос, а смотреть ответ на один вопрос, потом искать другую тему с ответом на другой вопрос, имхо, не очень удобно...
З.Ы. Я говорю только про вопросы близкие по теме.
З.З.Ы. Сорри за офтоп. Возможно я ошибаюсь...
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.1124 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.