Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сокеты, Соединение TCP/IP 
:(
    Опции темы
Misha_White
  Дата 16.5.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Snowy, 
Я написал
Код

procedure TClientForm.Socket_Proc_Read_Close(var Msg:TMessage);
Var err:integer;
    S:String;
begin
 if WSAGETSELECTEVENT(Msg.lParam) = FD_CLOSE then
  begin
   MessageDlg('Сервер закрыл соединение',mtInformation,[mbOk],0);
    ClientForm.Caption:='RemAdmin - Disconnected';
   ClientForm.Button1.Enabled:=true;
  end;

 if WSAGETSELECTEVENT(Msg.lParam) = FD_READ then  //После приема всего стрима возвращаемся сюда...
  begin
   if Reciv=false then
    begin
     Err:=recv(cSocket,DispSize,SizeOf(DispSize),0);
      If Err=Socket_Error then
        MessageBox(NULL,'Ошибка при получении!','Error',MB_OK)
      else
     reciv:=true;
    end
   else
    begin
     JpegIm:=TJPEGImage.Create;
      MyStream:=TMemoryStream.Create;
       SetLength(s,4096);
     While DispSize<>MyStream.Size do
      begin
       err:= recv(cSocket,S[1],DispSize,0);
         MyStream.Write(S[1],err);
        If Err=Socket_Error then
         begin
           MessageBox(NULL,'Ошибка при получении!','Error',MB_OK);
           Break;
         end;
      end;
       MyStream.Seek(0,soFromBeginning);
        JpegIm.LoadFromStream(MyStream);
         Image1.Picture.Assign(JpegIm);
       MyStream.Destroy;
      JpegIm.Destroy;
     Reciv:=false;
    end;
  end;
end;

Но после приема стрима, прога не выходит из цикла, а начинает с начала приема данных (хотя с сервера ничего не отправлялось)и, считывая DispSize , выдает ошибки...

Это сообщение отредактировал(а) Misha_White - 16.5.2007, 12:32
--------------------
Я не волшебник... я только учусь...  
PM MAIL ICQ Skype   Вверх
Snowy
Дата 16.5.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Принимай не DispSize, а 4096!
У тебя мимо буфера выливается
PM MAIL   Вверх
Misha_White
Дата 16.5.2007, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Snowy, 
Could not convert variant of type (Null) into (Int64)...

Добавлено через 41 секунду
Заругался клиент
--------------------
Я не волшебник... я только учусь...  
PM MAIL ICQ Skype   Вверх
Snowy
Дата 16.5.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



В каком месте?
Поменяй условие цикла на >
Пиши в стрим только, если err > 0
PM MAIL   Вверх
Misha_White
Дата 16.5.2007, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Snowy, 
Дело в том, что стрим записывается полностью, и картинка появляется, но процедура пытается еще считывать данные из сокета, а Reciv  у нас уже False, поэтому она пытается принять размер стрима... и так раза 4-5... потом только приходит новая картинка... походу...

Добавлено через 57 секунд
Snowy, 
Я Аську поставил... smile 
--------------------
Я не волшебник... я только учусь...  
PM MAIL ICQ Skype   Вверх
Snowy
Дата 16.5.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Это просто потому, что картинка шла несколькими частями.
А сокет у тебя асинхронный.
Вот и накопилась очередь сообщений о приходе данных.
О отрабатывает она только по выходу из обработчика.
Сразу выходи из обработчика, если в буфере пусто.
PM MAIL   Вверх
Misha_White
Дата 16.5.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Snowy, 
Каким Макаром?

Добавлено через 7 минут и 18 секунд
Snowy, 
Выйти из обработчика?
--------------------
Я не волшебник... я только учусь...  
PM MAIL ICQ Skype   Вверх
Snowy
Дата 16.5.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Exit
PM MAIL   Вверх
Misha_White
  Дата 16.5.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Snowy, 
Из обработчика... дело походу в том, что продолжает поступать сообщение NETEVENT_MSG... Вот... Поэтому процедура повторно(раз5-8) вызывается...
--------------------
Я не волшебник... я только учусь...  
PM MAIL ICQ Skype   Вверх
Snowy
Дата 16.5.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Разумеется вызывается.
Я даже написал почему.
А будет картинка большего размера - будет больше вызываться.
В самом начале обработчика вставь проверку на наличие данных в буфере.
Если данных 0, то сразу делай Exit;
PM MAIL   Вверх
Misha_White
  Дата 17.5.2007, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Snowy, 
Сделал подругому!
Код

procedure TClientForm.Socket_Proc_Read_Close(var Msg:TMessage);
Var err:integer;
    S:String;
begin
 if WSAGETSELECTEVENT(Msg.lParam) = FD_CLOSE then
  begin
   MessageDlg('Сервер закрыл соединение',mtInformation,[mbOk],0);
   ClientForm.Caption:='RemAdmin - Disconnected';
   ClientForm.Button1.Enabled:=true;
  end;

 if WSAGETSELECTEVENT(Msg.lParam) = FD_READ then
  begin
   if Reciv=false then
    begin
     Err:=recv(cSocket,DispSize,SizeOf(DispSize),0);
      If Err=Socket_Error then
        MessageBox(NULL,'Ошибка при получении!','Error',MB_OK)
      else
       begin
        reciv:=true;
         MyStream:=TMemoryStream.Create;
        JpegIm:=TJPEGImage.Create;
       end;
    end
   else
    begin
       SetLength(s,17520);
       err:= recv(cSocket,S[1],17520,0);
        If Err=Socket_Error then
         begin
          MessageBox(NULL,'Ошибка при получении!','Error',MB_OK);
          exit;
         end;
       MyStream.Write(S[1],err);
    if DispSize=MyStream.Size then
     begin
       MyStream.Position:=0; //Seek(0,soFromBeginning);
        JpegIm.LoadFromStream(MyStream);
         Image1.Canvas.Draw(0,0,JpegIm);
        MyStream.Destroy;
          JpegIm.Destroy;
      Reciv:=false;
     end;
    end;
  end;

end;

но почему-то ругается при второй попытке... в строке
Код

JpegIm.LoadFromStream(MyStream);

Т.е., когда принимаем вторую картинку... Принимается вроде как надо(размеры совпадают)... а при попытке загрузить в Image рагается, блин
Не могу понять почему...

Это сообщение отредактировал(а) Misha_White - 17.5.2007, 09:32
--------------------
Я не волшебник... я только учусь...  
PM MAIL ICQ Skype   Вверх
Misha_White
Дата 17.5.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Snowy, 
 smile 
--------------------
Я не волшебник... я только учусь...  
PM MAIL ICQ Skype   Вверх
Misha_White
Дата 17.5.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Snowy, 
Есть идеи, почему так?
--------------------
Я не волшебник... я только учусь...  
PM MAIL ICQ Skype   Вверх
Misha_White
Дата 18.5.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Misha_White, 
Такой вопрос: почему передавать нужно S[1]? что это значит?
--------------------
Я не волшебник... я только учусь...  
PM MAIL ICQ Skype   Вверх
Snowy
Дата 18.5.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



s[1] - первый символ. 
Это и есть начало буфера, поскольку сам стринг - указатель, а передать нужно буфер, а не указатель на него.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

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


 




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


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

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