Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.11.2013, 16:29
Blightn Blightn вне форума
Прохожий
 
Регистрация: 10.04.2009
Сообщения: 1
Версия Delphi: Delphi 7
Репутация: 10
Вопрос Использование TransmitFile с TCP

Доброго времени суток!
Имеется своя запись для хранения длины имени файла и самого имени:
Код:
PHeader = ^THeader;
THeader = record
  Size: Integer;
  Name: string;
end;
Функция TransmitFile и буфер с информацией, которая посылается до и после отправки файла:
Код:
function TransmitFile(hSocket: TSocket; hFile: THandle; nNumberOfBytesToWrite: DWORD;
  nNumberOfBytesPerSend: DWORD; lpOverlapped: POverlapped;
  lpTransmitBuffers: PTransmitFileBuffers; dwFlags: DWORD): BOOL; stdcall; external 'Mswsock.dll';

PTransmitFileBuffers = ^TTransmitFileBuffers;
_TRANSMIT_FILE_BUFFERS = record
  Head: Pointer;
  HeadLength: DWORD;
  Tail: Pointer;
  TailLength: DWORD;
end;
TTransmitFileBuffers = _TRANSMIT_FILE_BUFFERS;
Заполняется заголовок и буфер. Затем идет отправка файла:
Код:
var
  SendSocket: TSocket;
  FileName: string;
  SendFile: THandle;
  Header: THeader;
  Head: TTransmitFileBuffers;
  ...
Header.Size := Length(FileName);
Header.Name := FileName;
FillChar(Head, SizeOf(Head), 0);
Head.Head := @Header;
Head.HeadLength := SizeOf(Header);
TransmitFile(SendSocket, SendFile, 0, 0, nil, @Head, TF_USE_KERNEL_APC);
...
На сервере имя файла принимается так:
Код:
var
  FSocket: TSocket;
  FileName: string;
  Len: Integer;
  ...
SetLength(FileName, Len);
ReadFromSocket(FSocket, FileName[1], Len);
...
function TClientThread.ReadFromSocket(S: TSocket; var Buffer; Cnt: Integer): Integer;
var
  Res, Total: Integer;
begin
  Total := 0;
  Read := 0;
  repeat
    Res := recv(S, (PChar(@Buffer) + Total)^, Cnt - Total, 0);
    if Res = 0 then
    begin
      Result := 0;
      Exit;
    end;
    if Res < 0 then
    begin
      Result := -1;
      Exit;
    end;
    Inc(Total, Res);
  until Total >= Cnt;
  Result := 1;
end;
После чтения в переменной FileName находится некорректная строка, хотя размер файла приходит верный. Вопрос: как правильно отправить/принять имя файла?

Последний раз редактировалось Blightn, 02.11.2013 в 17:09.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:00.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025