Конференция "Сети" » Как правильно послать файл через TcpServer & TcpClient ? [D7, WinXP]
 
  • Andrewtitoff © (20.01.08 20:28) [20]
    Ну уж это то наверное мне решать поможет он мне или нет...
    А по поводу указателей - это да у меня с этим туго..., как то не пользовался в свое время - вот и нехватает знаний...  =(((
    Но я кстати пробовал писать и Buf^ и @Buf тока от этого ничего не менялось... =)))
    Так что если не хочешь помоч - так и скажи, или обьясни как и что делается....
  • Сергей М. © (20.01.08 20:31) [21]

    > если не хочешь помоч - так и скажи


    см. [1]
  • Сергей М. © (20.01.08 20:39) [22]

    > пробовал писать и Buf^ и @Buf тока от этого ничего не менялось


    В данном примере правильным будет Buf^.
    А вот почему правильной будет именна такая конструкция - это тебе задание на дом для самостоятельного изучения, это одна из основ языка, без знания которых дальнейшие рассуждения про бессмысленны.
  • Andrewtitoff © (20.01.08 20:48) [23]
    Так почему у меня и с Buf^ все тоже самое как и с Buf, и возвращает тоже 4...
  • Сергей М. © (20.01.08 21:00) [24]

    > почему у меня и с Buf^ все тоже самое как и с Buf


    А какое отношение это имеет к


    > возвращает тоже 4


    ?

    Никакого.

    Я тебе в [1] задал вопрос, ты до сих пор его игнорируешь. И долго еще эта сказка про белого бычка будет тянуться ?
  • Andrewtitoff © (20.01.08 22:00) [25]
    Да я понял уже давно эту свою ошибку что при описании указателя в статической области памяти будет выделено 4 байт - поэтому и возвращает размер переменной то есть 4 и возвращает....
  • Сергей М. © (20.01.08 22:11) [26]
    Чудесно.
    Приводи скорректированный вариант своего кода с учетом этой важной поправки..
  • Andrewtitoff © (21.01.08 09:36) [27]
    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;

  • Сергей М. © (21.01.08 09:49) [28]
    А где соответствующий скорректированный код сервера ?

    И чему равны значения св-ва BlockMode у клиента и у сервера ?
  • Andrewtitoff © (21.01.08 10:01) [29]
    В смысле код сервера?, а я что прислал? (procedure TMyChat.TcpServer1Accept)

    значения св-ва BlockMode у клиента и у сервера равны bmBlocking bmThreadBlocking соответственно.
  • Сергей М. © (21.01.08 10:32) [30]

    > а я что прислал?


    А где там коррекция в части ^?
    Где там выделение памяти под buf ?
    Откуда взялось 192 ?
    Где анализ результата вызова ReceiveBuf ?
    Где обработчик OnGetThread ?
    Где создание доп.потока ?
    Почему при bmThreadBlocking работа с клиентом идет в OnAccept, а не как и положено - в доп.потоке, который должен быть создан тобой в OnGetThread ?

    Нет этого ничего !
    Вот как будет, так и разговор продолжим.
  • Andrewtitoff © (21.01.08 10:57) [31]
    В смысле?
    Может я чего то недопонимаю  - подскажи тогда дураку...

    коррекция в части ^ вот, а где еще чего надо?
    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 пробелов в конец... =(((
  • Andrewtitoff © (21.01.08 11:11) [32]
    перенес ве это дело в 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;

  • Сергей М. © (21.01.08 11:15) [33]
    Ты вообще справку к этим компонентам читать собираешься ?
  • Andrewtitoff © (21.01.08 11:24) [34]
    Так а где ее взять то?, в дельфе написано:
    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.
  • Сергей М. © (21.01.08 11:25) [35]

    > 192 - это просто размер пересылаемого мною файла.


    А если файл будет другого размера ? Что, править и перекомпилировать проект будешь ?


    > можно поподробнее про анализ результата вызова ReceiveBuf


    Справку к этому методу ты проштудировал ? Что тебе там непонятно ?
  • Сергей М. © (21.01.08 11:34) [36]
    У и зачем использовать компоненты, для которых отсутствует справка ?
    Не ты ли тут трындел про поддержку компонентов в последующих версиях ?
    Отсутствие (частичное или полное) справки к этим компонентам в D2007 должно навести на мысль, что поддержка в будущем этих компонентов под большим вопросом.
  • Andrewtitoff © (21.01.08 11:37) [37]
    Нет, с Receiveln, SendLn я вроде разобрался, покрайне мере пример чата из 7-ых дельфей переделанный мною под TcpServer и TcpClient нормально работает.., буду пересылать размер...

    >Справку к этому методу ты проштудировал ? Что тебе там непонятно ?

    Так а где ее взять то?, у меня во первых с английским не очень, а во вторых все что есть в справке:
    Delphi 2007 VCL Win32 Reference  

    TCustomWinSocket.ReceiveBuf Method
    TCustomWinSocket Class | TCustomWinSocket Members | ScktComp Namespace | Description | See Also
    Collapse AllReads up to Count bytes from the socket connection into the Buf parameter.

    Pascal
    function ReceiveBuf(var Buf; Count: Integer): Integer;
    Description
    Use ReceiveBuf to read from the socket connection in the OnSocketEvent event handler of a Windows socket object or in the OnRead or OnClientRead event handler of a socket component. ReceiveBuf returns the number of bytes actually read. If no bytes are read, ReceiveBuf returns –1.

    ReceiveBuf only works in response to a read notification to a non-blocking windows socket. Blocking sockets must use a TWinSocketStream for reading. The TWinSocketStream object waits for the remote socket to be ready before transferring information.

    Note:  While the ReceiveLength method can return an estimate of the size of buffer required to retrieve information from the socket, the number of bytes it returns is not necessarily accurate.
  • Andrewtitoff © (21.01.08 11:41) [38]
    Кстати вот так заработало...:

    procedure TMyChat.TcpServer1Accept(Sender: TObject;
     ClientSocket: TCustomIpClient);
    var
    s:string;
        asd:tmemorystream;
        len:word;
        buf:pointer;
     begin
    len:=192;
    asd:=TMemoryStream.Create;
    GetMem(buf,len);
    ClientSocket.ReceiveBuf(buf^,len,0);
    asd.Position:=0;
    asd.WriteBuffer(buf^,len);
    asd.SaveToFile('c:\000.txt');
    asd.Free;
    FreeMem(Buf);
    TcpServer1.Close;
      end;

  • Сергей М. © (21.01.08 11:50) [39]

    > Кстати вот так заработало


    Теперь разнеси своего клиента и сервера по разным углам Тырнета и попытайся передать файл размером более 8 кб. Или попытайся обслужить более чем одного клиента одновременно. Грабли тебе гарантированы.


    > у меня во первых с английским не очень


    Печально. Ничего путного у тебя не получится, пока не выучишь.


    > все что есть в справке


    Это говорит как раз о том, что Борланд прекратил поддержку этих компонентов.

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