Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2008, 00:33   #1
NikLik
Форумчанин
 
Аватар для NikLik
 
Регистрация: 22.11.2007
Сообщений: 224
По умолчанию Передача потока. TServer\ClientSocket

Передача текста (клиент->сервер) проходит отлично.
Пытаюсь перебросить картинку(TMemoryStream).
Перебрасываю с TServerSocket на TClientSocket.
Так отправляю:
Код:
procedure tform1.screenshot;
var
  fs:tmemorystream;
begin
if boolean(serversocket1.Socket.ActiveConnections) then begin
fs:=tmemorystream.Create;
fs.Position:=0;
image1.Picture.Bitmap.SaveToStream(fs);
fs.Position:=0;
serversocket1.Socket.Connections[0].SendStream(fs);
fs.Destroy;
end;
end;
Так пытаюсь принять:
Код:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var iblen:integer;
buf:pchar;
fs:tmemorystream;
begin
fs:=tmemorystream.Create;
iblen:=socket.ReceiveLength;
getmem(buf,iblen+1);
fs.Position:=0;
socket.ReceiveBuf(buf,iblen);//на этой строке вылазит ошибка
fs.WriteBuffer(buf,iblen);
fs.Position:=0;
image1.Picture.Bitmap.LoadFromStream(fs);
end;
На отмеченной строке вылазит ошибка "Windows socket error: Программа на вашем хост-компьютере разорвала установленное подключение (10053), on API 'recv'".
Программа-сервер просто вылетает.
Как с этим бороться?
NikLik вне форума Ответить с цитированием
Старый 10.08.2008, 09:56   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Поток не нужно уничтожать. Он будет уничтожен сокетом после отправки.

serversocket1.Socket.Connections[0].SendStream(fs);
//fs.Destroy;

//По-моему уже был такой вопрос.
alexBlack вне форума Ответить с цитированием
Старый 10.08.2008, 10:20   #3
NikLik
Форумчанин
 
Аватар для NikLik
 
Регистрация: 22.11.2007
Сообщений: 224
По умолчанию

Проблема не решена. Та же самая ошибка
NikLik вне форума Ответить с цитированием
Старый 10.08.2008, 11:46   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

По-моему проблема с getMem и pChar.
Лучше pointer и вот так:

L := socket.ReceiveBuf(buf^, L);
fs.WriteBuffer(buf^, L);

На всякий случай весь проект:

Код:
// Client 
    Client : TClientSocket;
    procedure OnRead(Sender: TObject; Socket: TCustomWinSocket);

procedure TForm1.FormCreate(Sender: TObject);
begin
   Client := TClientSocket.Create(nil);
   Client.Address := '127.0.0.1';
   Client.Port    := 8020;
   Client.Active  := true;
   Client.OnRead  := OnRead;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   Client.Free;
end;

procedure TForm1.OnRead(Sender: TObject; Socket: TCustomWinSocket);
var fs:TMemoryStream;
    L:integer;
    buf : pointer;
begin
   fs := TMemoryStream.Create;
   try
      L := socket.ReceiveLength;
      fs.SetSize(L);
      getmem(buf, L);

      fs.Position := 0;
      L := socket.ReceiveBuf(buf^, L);
      fs.WriteBuffer(buf^, L);
      fs.Position:=0;
      image1.Picture.Bitmap.LoadFromStream(fs);

   finally
     fs.free;
     freeMem(buf);
   end;
end;

// Server
    Server : TServerSocket;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Server := TServerSocket.Create(nil);
   Server.Port := 8020;
   Server.Active := true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   Server.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var fs:tmemorystream;
begin
   if Server.Socket.ActiveConnections > 0 then begin
      fs := tmemorystream.Create;
      fs.Position:=0;
      image1.Picture.Bitmap.SaveToStream(fs);
      fs.Position:=0;
      Server.Socket.Connections[0].SendStream(fs);
   end
end;
alexBlack вне форума Ответить с цитированием
Старый 10.08.2008, 11:59   #5
NikLik
Форумчанин
 
Аватар для NikLik
 
Регистрация: 22.11.2007
Сообщений: 224
По умолчанию

Спасибо, проблема решена.
Но теперь появилась другая проблема-- ошибка Bitmap image is not valid.
Есть варианты решения?
NikLik вне форума Ответить с цитированием
Старый 10.08.2008, 12:09   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от NikLik Посмотреть сообщение
Спасибо, проблема решена.
Но теперь появилась другая проблема-- ошибка Bitmap image is not valid.
Есть варианты решения?
Пока делал тестовый проект такая ошибка тоже была когда забыл одну из галочек.
fs.WriteBuffer(buf^, L);
Проверьте еще раз. Код, который я привел, рабочий.
---------------------------
Есть еще один момент. Я использовал для теста BitMap 406 байт. Если поток большой, сервер запросто может разбить его на несколько пакетов. Проверьте количество вызовов OnRead (закоментируйте преобразование в BitMap и повесьте счетчик.). По-хорошему нужно бы сначала принять размер потока, потом все части и только когда поток принят полностью, преобразовывать его в BitMap.

Последний раз редактировалось alexBlack; 10.08.2008 в 12:31.
alexBlack вне форума Ответить с цитированием
Старый 10.08.2008, 12:29   #7
NikLik
Форумчанин
 
Аватар для NikLik
 
Регистрация: 22.11.2007
Сообщений: 224
По умолчанию

Кажется, я понял где "ошибка".
Ваш код полностью рабочий, но я не учёл 1 момент--картинка, похоже, передаётся не целиком, а по частям.(первый раз работаю с сокетами)Что мне и непонятно--видел несколько исходников, в которых это никак не предусматривалось--и всё работало.
Пересылка идёт по 8,2 кб.
Как с этим бороться?

Последний раз редактировалось NikLik; 10.08.2008 в 14:06.
NikLik вне форума Ответить с цитированием
Старый 10.08.2008, 20:12   #8
Pedro
Форумчанин
 
Аватар для Pedro
 
Регистрация: 25.03.2007
Сообщений: 166
По умолчанию

А тебе именно TServer\ClientSocket надо? Я передавал картинку через Indy компоненты, там это проще.
Pedro вне форума Ответить с цитированием
Старый 10.08.2008, 21:16   #9
NikLik
Форумчанин
 
Аватар для NikLik
 
Регистрация: 22.11.2007
Сообщений: 224
По умолчанию

Всем ещё раз спасибо, разобрался.
Выкладываю то, что получилось-- небольшая тулза(клиент-сервер)(считай--бэкдор), способная выполнять простейшие команды+ давать скриншот.
Вложения
Тип файла: rar remotec[бинарники].rar (338.8 Кб, 150 просмотров)
Тип файла: rar remotec[исходники].rar (17.9 Кб, 241 просмотров)
NikLik вне форума Ответить с цитированием
Старый 17.05.2013, 15:12   #10
frizz
 
Регистрация: 04.06.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от NikLik Посмотреть сообщение
Всем ещё раз спасибо, разобрался.
Выкладываю то, что получилось-- небольшая тулза(клиент-сервер)(считай--бэкдор), способная выполнять простейшие команды+ давать скриншот.
благодарю)))
frizz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Serversocket,clientsocket prizrak1390 Работа с сетью в Delphi 10 21.04.2009 16:04
Работа с ServerSocket и ClientSocket AlDelta Работа с сетью в Delphi 12 28.09.2008 11:18
Компонент ClientSocket Altera Компоненты Delphi 2 03.04.2008 15:37
Server & ClientSocket как без ip delphin100 Работа с сетью в Delphi 20 16.01.2008 17:12
Client Server Socket передача информации с помощью потока One.Love Работа с сетью в Delphi 4 15.01.2008 19:06