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.
================================================


Сергей М.   (2008-01-19 18:36:00) [61]


> Мне нкжен то пример
</I
> тока рабочий

>

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


Andrewtitoff   (2008-01-18 18:03:00) [62]

2 Сергей М.
Мне нкжен то пример такой жк как
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1190918176&n=4
тока рабочий и через TcpServer & TcpClient =)))
Заранее благодарен, надеюсь я не очень мнлго прошу... =)))


Andrewtitoff   (2008-01-18 17:51:00) [63]

2 Сергей М
Ну а что толку пытаться тестить в реальных условиях если она как ты говоришь и через тырнет не работает....
Не ну этого конечно тож никто не гарантировал что они в 2008-ой дельфе будут, но по крайне мере раз они их начиная с 7-щй дельфи выставляют на показ а TClientSocket в панели непоказывают хотя они до сих пор и присутствуют - то я считаю что вероятнее всего рано или поздно они на них окончательнно перейдут....
А по поводу объема я и не спорю просто пока тестирую - шлю определенный файл, размер которого мне известен и указываю явным образом его размер так что тут пока что никаких проблем не может быть, но прога то до сих пор толком не работает так что дело не в размере...
Серега если тебе не сложно не мучай меня дурака напиши как это делается,
ес ли ты знаешь как это пишется - то я не думаю что это же займет минут 5 написать простенькую прогу и выложить исходник, я думаю ьебе многие будут благодарны за это!!!  =))))
2 DVM ©
Да я понимаю что придется тестить в реальных условиях, тока для этого она дорлжна сначала хотябы так заработать....


DVM   (2008-01-18 16:59:00) [64]


> Andrewtitoff ©   (18.01.08 16:04) [9]


> Ну я тестирую на одном компе, пишу в RemoteHost - LocalHost,
>  а RemotePort такой же как и LocalPort, файл копируется

Советую потестить, например, через GPRS - очень хороший тест надежности копирования.


Сергей М.   (2008-01-18 16:50:00) [65]


> тестирую на одном компе


"на одном компе" <> "через Тырнет"

Запомни как тверди денно и нощно мантру.


> я пишу на 2007 дельфях, боюсь как бы в 2008 - х их уже небыло


Угу.

А то что в 2008 окажутся TTCPClient/Server - это в Библии, наверно,  записано)

Еще таз для танкистов - если передающая сторона не скажет принимающей объем следом передаваемых данных, принимающая сторона не будет иметь никаких гарантий корректности размера и содержимого принятых данных.


Andrewtitoff   (2008-01-18 16:04:00) [66]

2 Сергей М
Ну я тестирую на одном компе, пишу в RemoteHost - LocalHost, а RemotePort такой же как и LocalPort, файл копируется.., если не веришь могу исходник полностью кинуть....
А по поводу не моден ответить нечего, типа того... =))), просто я пишу на 2007 дельфях, боюсь как бы в 2008 - х их уже небыло... =))))


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


> раньше в TClientSocket


А теперь он типа не моден)


Palladin   (2008-01-18 15:21:00) [68]

а он его мысленно телепартирует :)


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


> пересылать то он пересылается


Где ?!!
Покажи хоть малейший намек на это в приведенном тобой коде ..


Andrewtitoff   (2008-01-18 15:16:00) [70]

2 Сергей М
Ясно, ну с размером конечно это не очень хороше, но в общем то мне все понятно, отправлю - не вопрос...
Так а в чем у меня еще ошибка то, я когда тестиркю размер файла то знаю, и его вписываю, тока пересылать то он пересылается, тока после этого программа с треском вываливается или всю систему вешает...  =(((


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


> как мне узнать размер пересылаемого файла?


А ты его отправлял, этот размер, прежде чем его принимать ?


> раньше в TClientSocket
> писалось Len:=Socket.ReceiveLength


Раньше у власти были коммуняки, мало ли какая фигня при них "писалась")


> а теперь как?


А теперь следует думать головой - если размер ты не отправил, то и принять его не сможешь.


Andrewtitoff   (2008-01-18 13:55:00) [72]

2 Slym
Спасибо, тока ничего не изменилось.. =((( тока если в ClientSocket.ReceiveBuf размер пишу 1024 как у тебя то почему то Len = -1, а если 192 как раньше(192 - это размер пересылаемого мною при тестировании файла) то все та же ошибка "Canvas does not allow drowing"... =(((
 
2 Сергей М.
Так а как мне узнать размер пересылаемого файла?, раньше в TClientSocket
писалось Len:=Socket.ReceiveLength;, а теперь как?...  =((((


Slym   (2008-01-18 13:20:00) [73]

Andrewtitoff ©   (18.01.08 10:57)
ClientSocket.ReceiveBuf(buf,192,0);

а память выделит папа Карло?
GetMem(buf,1024);
len:= ClientSocket.ReceiveBuf(buf,1024,0);
asd.WriteBuffer(buf,len);
FreeMem(buf)

или
var buf:array[0..1023] of byte;


Сергей М.   (2008-01-18 12:53:00) [74]


> SizeOf(Buf) возвращает все время 4


А сколько он, по твоему, должен возвратить, если переменная buf имеет указательный тип ?


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

Наверх

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