-
Пытаюсь послать файл, файл посылается, но прога все время вываливается с ошибками: 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
public
end;
var
MyChat: TMyChat;
implementation
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.
================================================
-
> SizeOf(Buf) возвращает все время 4
А сколько он, по твоему, должен возвратить, если переменная buf имеет указательный тип ?
-
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;
-
2 Slym Спасибо, тока ничего не изменилось.. =((( тока если в ClientSocket.ReceiveBuf размер пишу 1024 как у тебя то почему то Len = -1, а если 192 как раньше(192 - это размер пересылаемого мною при тестировании файла) то все та же ошибка "Canvas does not allow drowing"... =((( 2 Сергей М. Так а как мне узнать размер пересылаемого файла?, раньше в TClientSocket писалось Len:=Socket.ReceiveLength;, а теперь как?... =((((
-
> как мне узнать размер пересылаемого файла?
А ты его отправлял, этот размер, прежде чем его принимать ?
> раньше в TClientSocket > писалось Len:=Socket.ReceiveLength
Раньше у власти были коммуняки, мало ли какая фигня при них "писалась")
> а теперь как?
А теперь следует думать головой - если размер ты не отправил, то и принять его не сможешь.
-
2 Сергей М Ясно, ну с размером конечно это не очень хороше, но в общем то мне все понятно, отправлю - не вопрос... Так а в чем у меня еще ошибка то, я когда тестиркю размер файла то знаю, и его вписываю, тока пересылать то он пересылается, тока после этого программа с треском вываливается или всю систему вешает... =(((
-
> пересылать то он пересылается
Где ?!! Покажи хоть малейший намек на это в приведенном тобой коде ..
-
а он его мысленно телепартирует :)
-
> раньше в TClientSocket
А теперь он типа не моден)
-
2 Сергей М Ну я тестирую на одном компе, пишу в RemoteHost - LocalHost, а RemotePort такой же как и LocalPort, файл копируется.., если не веришь могу исходник полностью кинуть.... А по поводу не моден ответить нечего, типа того... =))), просто я пишу на 2007 дельфях, боюсь как бы в 2008 - х их уже небыло... =))))
-
> тестирую на одном компе
"на одном компе" <> "через Тырнет"
Запомни как тверди денно и нощно мантру.
> я пишу на 2007 дельфях, боюсь как бы в 2008 - х их уже небыло
Угу.
А то что в 2008 окажутся TTCPClient/Server - это в Библии, наверно, записано)
Еще таз для танкистов - если передающая сторона не скажет принимающей объем следом передаваемых данных, принимающая сторона не будет иметь никаких гарантий корректности размера и содержимого принятых данных.
-
> Andrewtitoff © (18.01.08 16:04) [9]
> Ну я тестирую на одном компе, пишу в RemoteHost - LocalHost, > а RemotePort такой же как и LocalPort, файл копируется
Советую потестить, например, через GPRS - очень хороший тест надежности копирования.
-
2 Сергей М Ну а что толку пытаться тестить в реальных условиях если она как ты говоришь и через тырнет не работает.... Не ну этого конечно тож никто не гарантировал что они в 2008-ой дельфе будут, но по крайне мере раз они их начиная с 7-щй дельфи выставляют на показ а TClientSocket в панели непоказывают хотя они до сих пор и присутствуют - то я считаю что вероятнее всего рано или поздно они на них окончательнно перейдут.... А по поводу объема я и не спорю просто пока тестирую - шлю определенный файл, размер которого мне известен и указываю явным образом его размер так что тут пока что никаких проблем не может быть, но прога то до сих пор толком не работает так что дело не в размере... Серега если тебе не сложно не мучай меня дурака напиши как это делается, ес ли ты знаешь как это пишется - то я не думаю что это же займет минут 5 написать простенькую прогу и выложить исходник, я думаю ьебе многие будут благодарны за это!!! =)))) 2 DVM © Да я понимаю что придется тестить в реальных условиях, тока для этого она дорлжна сначала хотябы так заработать....
-
-
> Мне нкжен то пример </I > тока рабочий
>
Предположим, ты его получил. Что-то ты изменил в нем, пример перестал работать. Что дальше? Опять гундеть-канючить будешь ?)
-
2 Сергей М. Да ладно те..., сразу оскорблять.., я конечно не великий программер как ты, но не до такой степени лапух что не смогу переделать под себя элементарный пример..., Если лень -так и скажи..., а если нет - то кинь пример и забудем, обещаю что больше канючить небуду! =))))
-
> не до такой степени лапух
Ты лапух не "в степени". Ты просто лАпух. А "лапухам не до такой степени" не пристало учить и знать Паскаль.
Возражать имеешь ?)
Какие тебе, нахрен, сети и компоненты ? КАКОГО хрена ты нетипизированным var-параметром передаешь buf ?
Бегом учить паскаль !!
И чтоб тебя здесь не было, пока не выучишь сам язык, прежде чем его применять для даже элементарных задач)
-
> [16]
+1
> но не до такой степени лапух что не смогу переделать под > себя элементарный пример...
так если он для тебя элементарный, то зачем просишь его тебе написать???
-
2 Сергей М. Даа.., видиммо для тебя это тоже не такая элементарная задача иначе бы просто прислал бы пеример и не гнул пальцы.... И при чем тут паскаль?, писал я немного в свое время и на паскале, тока писал то что мне надо был, а файли ки мне надо было тока маленткие копировать и т.д. по этому мне хватало read write... и читал - писал себе спокойно по байтам.... И как же ты хочешь что бы я что то изучал - если сам обьяснять не хочешь....
2 MetalFan Я имел ввиду для него элементарный - видимо ошибся...
-
> иначе бы просто прислал бы пеример
Он тебе не поможет. Потому что когда тебе говорят про фому, ты все одно гнешь про ерему.
Тебе в [1] был задан вопрос, правильный самостоятельный ответ на который - шаг к самостоятельному решению задачи.
|