![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно послать файл через TcpServer & TcpClient ? [D7, WinXP]
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]Так а как правилино сделать с :
>Или попытайся обслужить более чем одного клиента одновременно
А как сделать то??, хотя для задачи которая на данный момент передомной стоит мне вполне хватит две пары клиент-сервер, но все таки хотелось бы знать и как сделать с несколькими клиентами... =(((