![]() |
| ||
|
|
Новости |
Поиск |
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-21 11:24:00) [41]Так а где ее взять то?, в дельфе написано:
Delphi 2007 for Win32
Using Socket Components
See Also
Collapse AllThe Internet category includes three socket components that allow your network application to form connections to other machines, and that allow you to read and write information over that connection. These are:
TTcpServer
TTcpClient
TUdpSocket
Associated with each of these socket components are socket objects, which represent the endpoint of an actual socket connection. The socket components use the socket objects to encapsulate the socket server calls, so that your application does not need to be concerned with the details of establishing the connection or managing the socket messages.
If you want to customize the details of the connections that the socket components make on your behalf, you can use the properties, events, and methods of the socket objects.
Сергей М. (2008-01-21 11:15:00) [42]Ты вообще справку к этим компонентам читать собираешься ?
Andrewtitoff (2008-01-21 11:11:00) [43]перенес ве это дело в GetThread, та же история... =(((
procedure TMyChat.TcpServer1GetThread(Sender: TObject;
var ClientSocketThread: TClientSocketThread);
var
s:string;
asd:tmemorystream;
len:word;
buf:pointer;
begin
len:=192;
asd:=TMemoryStream.Create;
GetMem(buf,len);
TcpServer1.ReceiveBuf(buf^,len,0);
asd.Position:=0;
asd.WriteBuffer(buf^,len);
asd.SaveToFile('c:\000.txt');
asd.Free;
FreeMem(Buf);
TcpServer1.Close;
end;
Andrewtitoff (2008-01-21 10:57:00) [44]В смысле?
Может я чего то недопонимаю - подскажи тогда дураку...
коррекция в части ^ вот, а где еще чего надо?
len:= ClientSocket.ReceiveBuf(buf^,len,0);
asd.WriteBuffer(buf^,len);
192 - это просто размер пересылаемого мною файла...
А можно поподробнее про анализ результата вызова ReceiveBuf, а то чет я непонимаю чего там как и вообще зачем анализировать?
А что в обработчик OnGetThread писать надо?
И как создавать доп. поток?
Мне нигде ненайти ничего по работе с TcpServer и TcpClient..., нашел примеры тока с Receiveln, SendLn..., там все ясно но там все идет в OnAccept...
Кстати ошибку я вроде нашел.., там просто TcpClient1.Active := True нужно было писать не в прцедуре ConnectClick a уже в SendFileClick...
Теперь прога не вылетает тока почему то обрезает первые 26 байт содержимого файла и добовляет соответственно 26 пробелов в конец... =(((
Сергей М. (2008-01-21 10:32:00) [45]
> а я что прислал?
А где там коррекция в части ^?
Где там выделение памяти под buf ?
Откуда взялось 192 ?
Где анализ результата вызова ReceiveBuf ?
Где обработчик OnGetThread ?
Где создание доп.потока ?
Почему при bmThreadBlocking работа с клиентом идет в OnAccept, а не как и положено - в доп.потоке, который должен быть создан тобой в OnGetThread ?
Нет этого ничего !
Вот как будет, так и разговор продолжим.
Andrewtitoff (2008-01-21 10:01:00) [46]В смысле код сервера?, а я что прислал? (procedure TMyChat.TcpServer1Accept)
значения св-ва BlockMode у клиента и у сервера равны bmBlocking bmThreadBlocking соответственно.
Сергей М. (2008-01-21 09:49:00) [47]А где соответствующий скорректированный код сервера ?
И чему равны значения св-ва BlockMode у клиента и у сервера ?
Andrewtitoff (2008-01-21 09:36:00) [48]2 Сергей М.
Чет я совсем ниче не понимаю..., вот скорректированный код, но все работает как и прежде, вылетает с ошибкой "Canvas does not allow drawing"... =(((
Так в чем ошибка то?, тока не говори про ДНК - это старая шутка... =)))
procedure TMyChat.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
var
asd:tmemorystream;
len:word;
buf:pointer;
begin
len:=192;
asd:=TMemoryStream.Create;
GetMem(buf,len);
len:= ClientSocket.ReceiveBuf(buf^,len,0);
asd.Position:=0;
asd.WriteBuffer(buf^,len);
asd.SaveToFile('c:\000.txt');
asd.Free;
FreeMem(Buf);
clientsocket.Close;
ShowMessage('clientsocket.Close');
end;
Сергей М. (2008-01-20 22:11:00) [49]Чудесно.
Приводи скорректированный вариант своего кода с учетом этой важной поправки..
Andrewtitoff (2008-01-20 22:00:00) [50]Да я понял уже давно эту свою ошибку что при описании указателя в статической области памяти будет выделено 4 байт - поэтому и возвращает размер переменной то есть 4 и возвращает....
Сергей М. (2008-01-20 21:00:00) [51]
> почему у меня и с Buf^ все тоже самое как и с Buf
А какое отношение это имеет к
> возвращает тоже 4
?
Никакого.
Я тебе в [1] задал вопрос, ты до сих пор его игнорируешь. И долго еще эта сказка про белого бычка будет тянуться ?
Andrewtitoff (2008-01-20 20:48:00) [52]Так почему у меня и с Buf^ все тоже самое как и с Buf, и возвращает тоже 4...
Сергей М. (2008-01-20 20:39:00) [53]
> пробовал писать и Buf^ и @Buf тока от этого ничего не менялось
В данном примере правильным будет Buf ^.
А вот почему правильной будет именна такая конструкция - это тебе задание на дом для самостоятельного изучения, это одна из основязыка, без знания которых дальнейшие рассуждения про бессмысленны.
Сергей М. (2008-01-20 20:31:00) [54]
> если не хочешь помоч - так и скажи
см. [1]
Andrewtitoff (2008-01-20 20:28:00) [55]Ну уж это то наверное мне решать поможет он мне или нет...
А по поводу указателей - это да у меня с этим туго..., как то не пользовался в свое время - вот и нехватает знаний... =(((
Но я кстати пробовал писать и Buf^ и @Buf тока от этого ничего не менялось... =)))
Так что если не хочешь помоч - так и скажи, или обьясни как и что делается....
Сергей М. (2008-01-20 19:38:00) [56]
> иначе бы просто прислал бы пеример
Он тебе не поможет.
Потому что когда тебе говорят про фому, ты все одно гнешь про ерему.
Тебе в [1] был задан вопрос, правильный самостоятельныйответ на который - шаг к самостоятельномурешению задачи.
Andrewtitoff (2008-01-20 14:25:00) [57]2 Сергей М.
Даа.., видиммо для тебя это тоже не такая элементарная задача иначе бы просто прислал бы пеример и не гнул пальцы....
И при чем тут паскаль?, писал я немного в свое время и на паскале, тока писал то что мне надо был, а файли ки мне надо было тока маленткие копировать и т.д. по этому мне хватало read write... и читал - писал себе спокойно по байтам....
И как же ты хочешь что бы я что то изучал - если сам обьяснять не хочешь....
2 MetalFan
Я имел ввиду для него элементарный - видимо ошибся...
MetalFan (2008-01-20 02:15:00) [58]
> [16]
+1
> но не до такой степени лапух что не смогу переделать под
> себя элементарный пример...
так если он для тебя элементарный, то зачем просишь его тебе написать???
Сергей М. (2008-01-20 00:18:00) [59]
> не до такой степени лапух
Ты л апух не "в степени".
Ты просто л Апух.
А "л апухам не до такой степени" не пристало учить и знать Паскаль.
Возражать имеешь ?)
Какие тебе, нахрен, сети и компоненты ?
КАКОГО хрена ты нетипизированным var-параметром передаешь buf ?
Бегом учить паскаль !!
И чтоб тебя здесь не было, пока не выучишь сам язык, прежде чем его применять для даже элементарных задач)
Andrewtitoff (2008-01-19 23:39:00) [60]2 Сергей М.
Да ладно те..., сразу оскорблять.., я конечно не великий программер как ты, но не до такой степени лапух что не смогу переделать под себя элементарный пример...,
Если лень -так и скажи..., а если нет - то кинь пример и забудем, обещаю что больше канючить небуду! =))))