Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно послать файл через TcpServer & TcpClient ? [D7, WinXP]


Страницы:   1 2 3 4

Andrewtitoff ©   (2008-01-18 10:57:00) 

Пытаюсь послать файл, файл посылается, но прога все время вываливается с ошибками:
Access violation, Canvas does not allow drawing... =(((
И как при приеме узнать размер пересылаемого файла что бы засунуть его в ReceiveBuf.., SizeOf(Buf) возвращает все время 4 ... =(((
Вот текст моей программы:

================================================
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Sockets, StdCtrls;

type
 TMyChat = class(TForm)
   Label1: TLabel;
   Label2: TLabel;
   Label3: TLabel;
   RemoteHost: TEdit;
   RemotePort: TEdit;
   LocalPort: TEdit;
   Display: TMemo;
   Edit: TEdit;
   Connect: TButton;
   TcpServer1: TTcpServer;
   TcpClient1: TTcpClient;
   SendFile: TButton;
   procedure TcpServer1Accept(Sender: TObject; ClientSocket: TCustomIpClient);
   procedure SendClick(Sender: TObject);
   procedure ConnectClick(Sender: TObject);
   procedure SendFileClick(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 MyChat: TMyChat;

implementation

{$R *.dfm}

procedure TMyChat.ConnectClick(Sender: TObject);
begin
TcpServer1.LocalPort := LocalPort.Text;
TcpServer1.Active := True;
TcpClient1.RemotePort := RemotePort.Text;;
TcpClient1.RemoteHost := RemoteHost.Text;;
TcpClient1.Active := True;
end;

procedure TMyChat.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TcpServer1.Active := False;
TcpClient1.Active:= False;
TcpClient1.Disconnect;
end;

procedure TMyChat.SendFileClick(Sender: TObject);
var
asd:Tmemorystream;
begin
asd := TMemoryStream.Create;
asd.Position:=0;
asd.LoadFromFile('c:\1.txt');
asd.Position:=0;
TcpClient1.Active := True;
 try
   if TcpClient1.Connect then
     begin
     TcpClient1.SendStream(asd);
     end;
 finally
   TcpClient1.Disconnect;
 end;
asd.free;
end;

procedure TMyChat.TcpServer1Accept(Sender: TObject;
 ClientSocket: TCustomIpClient);
var
    s:string;
    asd:tmemorystream;
    len:integer;
    buf:pointer;
 begin
asd:=TMemoryStream.Create;
asd.Position:=0;
len:= ClientSocket.ReceiveBuf(buf,192,0);
asd.WriteBuffer(buf,len);
asd.SaveToFile('c:\000.txt');
asd.Free;
FreeMem(Buf);
clientsocket.Close;
ShowMessage('clientsocket.Close');
end;

end.
================================================


Andrewtitoff   (2008-01-29 12:02:00) [1]

Удалено модератором
Примечание: СПАМ


hero   (2008-01-27 04:05:00) [2]

))


Andrewtitoff   (2008-01-26 15:48:00) [3]

2 Сергей М.
Во - во...  =))))
коммерсанты блин..., развелось тут всяких...  =))))

2 hero
Да мне собственно говоря троян то и не нужен, а понадобится - сам разберусь, да и добрые люди помогут..., тебе на рынок надо может там купят... =)))


Сергей М.   (2008-01-26 13:38:00) [4]


>  за небольшую сумму могу скинуть


"Налетай, торопись, покупай живопИсь !" (с)

))


hero   (2008-01-26 12:42:00) [5]


> Andrewtitoff ©


если тебя это еще интересует за небольшую сумму могу скинуть исходник своего трояна мыло оставляй


Slym   (2008-01-23 07:41:00) [6]

Сергей М. ©   (22.01.08 16:37) [67]
Медвежья усуга ?

"Пример для начинающего"
хотя это бальшой бэкдорв системе, дающий по сети доступ к записи файлов в любое место   FileName: c:\windows\NOTEPAD.EXE


Andrewtitoff   (2008-01-22 18:51:00) [7]

Нет, спасибо, просто сейчас немного не до этого, проблемки появились, сейчас не до этого...  =((((


Сергей М.   (2008-01-22 16:37:00) [8]


> Slym


Медвежья усуга ?


Slym   (2008-01-22 05:08:00) [9]

Передача файла с именем и размером...
протокол:
FileName: c:\test.txt
Size:10
<<пустая строка, за которой идут бинарные данные
1234567890
<<Сервер может комментировать свое состояние

procedure TForm1.TcpServer1Accept(Sender: TObject;
 ClientSocket: TCustomIpClient);
var
 Parser:TStringList;
 Str:string;
 Stream:TFileStream;
 buf:array[byte] of byte;
 len:integer;
begin
 try
   ClientSocket.Sendln('+OK Hello! File sender pleased to meet you');
   Parser:=TStringList.Create;
   try
     Parser.NameValueSeparator:=':';
     while ClientSocket.Connected do
     begin
       Str:=ClientSocket.Receiveln;
       if Str='' then break;
       Parser.Add(Str);
     end;
     if Parser.IndexOfName('FileName')<0 then raise Exception.Create('No filename');
     if Parser.IndexOfName('Size')<0 then raise Exception.Create('No file size');
     Stream:=TFileStream.Create(Parser.Values['FileName'], fmCreate);
     try
       Stream.Size:=StrToInt(Parser.Values['Size']);
       ClientSocket.Sendln('+OK You can send file');
       Stream.Seek(0, soBeginning);
       while ClientSocket.Connected do
       begin
         len:=ClientSocket.ReceiveBuf(buf,SizeOf(buf),0);
         if len<=0 then Break;
         len:=min(len,Stream.Size-Stream.Position);
         Stream.WriteBuffer(buf,len);
         if Stream.Size=Stream.Position then
         begin
           ClientSocket.Sendln('+OK You file accepted. Disconnect.');
           ClientSocket.Disconnect;
         end;
       end;
     finally
       Stream.Free;
     end;
   finally
     Parser.Free;
   end;
 except
   on E:Exception do
   begin
     if ClientSocket.Connected then
       ClientSocket.Sendln('-ERR Raised exception with message: '+E.Message)
     else
       raise;
   end;
 end;
end;


Slym   (2008-01-22 04:39:00) [10]

Сохраняется сразу в файл, концом передачи/файла считается отключение клиента...
если клиента тупо оборвало, всеравно считается концом передачи


Slym   (2008-01-22 04:37:00) [11]

Коротко и ясно...
procedure TForm1.TcpServer1Accept(Sender: TObject;
 ClientSocket: TCustomIpClient);
var
 Stream:TFileStream;
 buf:array[byte] of byte;
 len:integer;
begin
 Stream:=TFileStream.Create('c:\file_'+FormatDateTime('ddmmyyyy_hhmmss',Now)+'.txt', fmCreate);
 try
   while ClientSocket.Connected do
   begin
     len:=ClientSocket.ReceiveBuf(buf,SizeOf(buf),0);
     if len<=0 then Break;
     Stream.WriteBuffer(buf,len);
   end;
 finally
   Stream.Free;
 end;
end;


Andrewtitoff   (2008-01-21 18:29:00) [12]

думаю надо, зачем сразу оскорблять то? =))))


Сергей М.   (2008-01-21 16:53:00) [13]

Сам-то как думаешь ?
Или ты отвык (или никогда не умел ?) думать ?


Andrewtitoff   (2008-01-21 16:43:00) [14]

Или там заново надо писать  TcpClient1.Active := True;?


Andrewtitoff   (2008-01-21 16:33:00) [15]

Так а как надо реагировать то?, ну с -1 - отдельный разговор хотя бы потому что в вычислениях бред пойдет, но а с нулем то что?, веди при LenRes1=0 оно все равно не равно len которая в данном случае равна 68096 и следовательно LenRes2 = 0 + 0, а  lenRes1 = 68096 - 0 т.е. тем же самым 68096...


Сергей М.   (2008-01-21 16:24:00) [16]

0 - это факт штатного закрытия соединения партнером по его инициативе.
-1 - факт нештатного (аварийного) разрыва соединения (например, уборщица партнера БабКлава выдернула шваброй сетевой шнур из компа или злобные хакеры из Тимбукту перекусили оптоволокно между Бобруйском и СПб)

Ни тот ни другой случай ты не ожидаешь и никак не реагируешь на них.


Andrewtitoff   (2008-01-21 16:17:00) [17]

Так если ноль - то помоему ничего страшного, он просто стока стока же запросит скока и изначально, или тут что то не так?


Сергей М.   (2008-01-21 15:55:00) [18]


> А как сделать то?


Ты еще с работой с одним клиентом не разобрался.

Разберешься доскональнос одним - вот тогда перейдем к многим клиентам.

А пока вернемся к делам нашим скорбным: предположим, что ReceiveBuf вернул 0 или -1 ...


Andrewtitoff   (2008-01-21 15:50:00) [19]

Просто вообще мне надо что бы моя прога пересылала туда-сюда файлы и что бы можно было управлять ей удаленно.., как это сделать?, я конечно могу сейчас наклепать еще одну связку клиент-сервер и по одной передавать файло, а по другой команды, но я так предполагаю что есть способ лучше


Andrewtitoff   (2008-01-21 15:37:00) [20]

Так а как правилино сделать  с :

>Или попытайся обслужить более чем одного клиента одновременно

А как сделать то??, хотя для задачи которая на данный момент передомной стоит мне вполне хватит две пары клиент-сервер, но все таки хотелось бы знать и как сделать с несколькими клиентами...  =(((


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо