![]() |
| ||
|
|
Новости |
Поиск |
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.
================================================
Сергей М. (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 имеет указательный тип ?