[Delphi] Сокеты - загрузка файлов

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Kandi, 9 Sep 2012.

  1. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Добрый день всем, как загрузить файл с помощью сокета? почему в массив байтов TB: array [0..3] of Byte не записываются данные, которые я читаю в цикле с помощью recv(Tsocket, tb, length(tb) 0);

    P.S. Возможны опечатки в recv писал на память...
     
  2. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Этого кода недостаточно. Приведи листинг.
    А тут можешь посмортреть работу с сокетами
    http://forum.antichat.net/showpost.php?p=788789&postcount=11
     
  3. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Ну Вот, в конечном итоге ТB пустой постоянно...

    Code:
    var
      TWS : TWSAData;
      TCPSocket : TSocket;
      TAddr : TSockAddrIn;
      sendbuff, recvbuff: array [0..1023] of AnsiChar;
      S, Str : String;
      I : Integer;
      H : THandle;
      TB : array [1..8] of Byte;
      f : File;
    begin
                    { Обнуляем память sendBuff }
                    FillChar(sendbuff, 1024, 0);
                    sendbuff := 'GET /file.exe HTTP/1.1' + #13#10 +
                                'Host: uploadfoto.ru' + #13#10 +
                                'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1' + #13#10 +
                                'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' + #13#10 +
                                'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3' + #13#10 +
                                'Connection: keep-alive' + #13#10 + #13#10;
                    { Отсылаем запрос }
                    send(TCPSocket, sendbuff[0], SizeOf(sendbuff), 0);
    
                    H := CreateFile(PChar('file.exe'), GENERIC_READ, FILE_SHARE_WRITE or
                                    FILE_SHARE_READ, nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
                    CloseHandle(H);
                    AssignFile(f, 'file.exe');
                    Reset(f, 4);
                    try
                      { Читаем ответ И записываем }
                      repeat
                        FillChar(TB, 8, 0);
                        recv(TCPSocket, TB, Length(TB), 0);
                        BlockWrite(f, TB, 2);
                      until false;
                    finally
                      CloseFile(f);
                    end;
    


    Возник такой вопрос, обязательно ли создавать соединение Connect(TCPSocket, TAddr, SizeOf(TSockAddr)); перед каждой отправкой header send(TCPSocket, sendbuffer[1], length(sendbuffer), 0);???
     
    #3 Kandi, 9 Sep 2012
    Last edited: 10 Sep 2012
  4. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Kandi, ты мазохист, а если у тебя файлик в метров 20 будет, ты так и будешь его читать по 8 байт, дергая туеву хучу recv?
    Увеличь буфер хотя бы до 8192 байт.
    connect не нужно каждый раз создавать перед вызовом send.
    Code:
     H := CreateFile(PChar('file.exe'), GENERIC_READ, FILE_SHARE_WRITE or
    FILE_SHARE_READ, nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
    CloseHandle(H);
    AssignFile(f, 'file.exe');
    Reset(f, 4);
    Нафига мешаешь паскалефские обертки и winapi ? используй что-то одно (winapi, TFileStream)
    Code:
    recv(TCPSocket, TB, Length(TB), 0);
    BlockWrite(f, TB, 2);
    И проверяй, что возвращает тебе функция recv
     
  5. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    без connect вообще ничего не хочет возвращать даже заголовки... я учусь, не надо ругаться :D
     
  6. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    дак ясен пень, что без коннекта тебе ничего не светит, имелось ввиду следующее:
    Code:
    if (WSAConnect(hSocket, @SockAddrIn, SizeOf(TSockAddr), nil, nil, nil, nil) = SOCKET_ERROR) then begin
       CloseSocket(hSocket);
       Exit;
    end;
    ....
    send(hSocket, sendData1^, cdLenData1, 0);
    ....
    send(hSocket, sendData2^, cdLenData2, 0);
    ....
    send(hSocket, sendData3^, cdLenData3, 0);
    ....
    CloseSocket(hSocket);
     
  7. Redfern89

    Redfern89 New Member

    Joined:
    12 Jul 2012
    Messages:
    42
    Likes Received:
    1
    Reputations:
    -3
    Connection: Close