Добрый день всем, как загрузить файл с помощью сокета? почему в массив байтов TB: array [0..3] of Byte не записываются данные, которые я читаю в цикле с помощью recv(Tsocket, tb, length(tb) 0); P.S. Возможны опечатки в recv писал на память...
Этого кода недостаточно. Приведи листинг. А тут можешь посмортреть работу с сокетами http://forum.antichat.net/showpost.php?p=788789&postcount=11
Ну Вот, в конечном итоге Т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);???
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
дак ясен пень, что без коннекта тебе ничего не светит, имелось ввиду следующее: 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);