Конференция "Сети" » Как правильно послать файл через TcpServer & TcpClient ? [D7, WinXP]
 
  • Andrewtitoff © (18.01.08 10:57) [0]
    Пытаюсь послать файл, файл посылается, но прога все время вываливается с ошибками:
    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.
    ================================================

  • Сергей М. © (18.01.08 12:53) [1]

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


    А сколько он, по твоему, должен возвратить, если переменная buf имеет указательный тип ?
  • Slym © (18.01.08 13:20) [2]
    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;

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

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


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


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


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


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


    А теперь следует думать головой - если размер ты не отправил, то и принять его не сможешь.
  • Andrewtitoff © (18.01.08 15:16) [5]
    2 Сергей М
    Ясно, ну с размером конечно это не очень хороше, но в общем то мне все понятно, отправлю - не вопрос...
    Так а в чем у меня еще ошибка то, я когда тестиркю размер файла то знаю, и его вписываю, тока пересылать то он пересылается, тока после этого программа с треском вываливается или всю систему вешает...  =(((
  • Сергей М. © (18.01.08 15:18) [6]

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


    Где ?!!
    Покажи хоть малейший намек на это в приведенном тобой коде ..
  • Palladin © (18.01.08 15:21) [7]
    а он его мысленно телепартирует :)
  • Сергей М. © (18.01.08 15:23) [8]

    > раньше в TClientSocket


    А теперь он типа не моден)
  • Andrewtitoff © (18.01.08 16:04) [9]
    2 Сергей М
    Ну я тестирую на одном компе, пишу в RemoteHost - LocalHost, а RemotePort такой же как и LocalPort, файл копируется.., если не веришь могу исходник полностью кинуть....
    А по поводу не моден ответить нечего, типа того... =))), просто я пишу на 2007 дельфях, боюсь как бы в 2008 - х их уже небыло... =))))
  • Сергей М. © (18.01.08 16:50) [10]

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


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

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


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


    Угу.

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

    Еще таз для танкистов - если передающая сторона не скажет принимающей объем следом передаваемых данных, принимающая сторона не будет иметь никаких гарантий корректности размера и содержимого принятых данных.
  • DVM © (18.01.08 16:59) [11]

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


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

    Советую потестить, например, через GPRS - очень хороший тест надежности копирования.
  • Andrewtitoff © (18.01.08 17:51) [12]
    2 Сергей М
    Ну а что толку пытаться тестить в реальных условиях если она как ты говоришь и через тырнет не работает....
    Не ну этого конечно тож никто не гарантировал что они в 2008-ой дельфе будут, но по крайне мере раз они их начиная с 7-щй дельфи выставляют на показ а TClientSocket в панели непоказывают хотя они до сих пор и присутствуют - то я считаю что вероятнее всего рано или поздно они на них окончательнно перейдут....
    А по поводу объема я и не спорю просто пока тестирую - шлю определенный файл, размер которого мне известен и указываю явным образом его размер так что тут пока что никаких проблем не может быть, но прога то до сих пор толком не работает так что дело не в размере...
    Серега если тебе не сложно не мучай меня дурака напиши как это делается,
    ес ли ты знаешь как это пишется - то я не думаю что это же займет минут 5 написать простенькую прогу и выложить исходник, я думаю ьебе многие будут благодарны за это!!!  =))))
    2 DVM ©
    Да я понимаю что придется тестить в реальных условиях, тока для этого она дорлжна сначала хотябы так заработать....
  • Andrewtitoff © (18.01.08 18:03) [13]
    2 Сергей М.
    Мне нкжен то пример такой жк как
    http://pda.delphimaster.net/?id=1190918176&n=4
    тока рабочий и через TcpServer & TcpClient =)))
    Заранее благодарен, надеюсь я не очень мнлго прошу... =)))
  • Сергей М. © (19.01.08 18:36) [14]

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

    >

    Предположим, ты его получил.
    Что-то ты изменил в нем, пример перестал работать. Что дальше? Опять гундеть-канючить будешь ?)
  • Andrewtitoff © (19.01.08 23:39) [15]
    2 Сергей М.
    Да ладно те..., сразу оскорблять.., я конечно не великий программер как ты, но не до такой степени лапух что не смогу переделать под себя элементарный пример...,
    Если лень -так и скажи..., а если нет - то кинь пример и забудем, обещаю что больше канючить небуду! =))))
  • Сергей М. © (20.01.08 00:18) [16]

    > не до такой степени лапух


    Ты лапух не "в степени".
    Ты просто лАпух.
    А "лапухам не до такой степени" не пристало учить и знать Паскаль.

    Возражать имеешь ?)

    Какие тебе, нахрен, сети и компоненты ?
    КАКОГО хрена ты нетипизированным var-параметром передаешь buf ?

    Бегом учить паскаль !!

    И чтоб тебя здесь не было, пока не выучишь сам язык, прежде чем его применять для даже элементарных задач)
  • MetalFan © (20.01.08 02:15) [17]

    >  [16]

    +1

    > но не до такой степени лапух что не смогу переделать под
    > себя элементарный пример...

    так если он для тебя элементарный, то зачем просишь его тебе написать???
  • Andrewtitoff © (20.01.08 14:25) [18]
    2 Сергей М.
    Даа.., видиммо для тебя это тоже не такая элементарная задача иначе бы просто прислал бы пеример и не гнул пальцы....
    И при чем тут паскаль?, писал я немного в свое время и на паскале, тока писал то что мне надо был, а файли ки мне надо было тока маленткие копировать и т.д. по этому мне хватало read write... и читал - писал себе спокойно по байтам....
    И как же ты хочешь что бы я что то изучал - если сам обьяснять не хочешь....

    2 MetalFan
    Я  имел ввиду для него элементарный - видимо ошибся...
  • Сергей М. © (20.01.08 19:38) [19]

    > иначе бы просто прислал бы пеример


    Он тебе не поможет.
    Потому что когда тебе говорят про фому, ты все одно гнешь про ерему.

    Тебе в [1] был задан вопрос, правильный самостоятельный ответ на который - шаг к самостоятельному решению задачи.
 
Конференция "Сети" » Как правильно послать файл через TcpServer & TcpClient ? [D7, WinXP]
Есть новые Нет новых   [134431   +14][b:0][p:0.002]