Доброго времени суток!
Имеется своя запись для хранения длины имени файла и самого имени:
Код:
1 2 3 4 5 | PHeader = ^THeader;
THeader = record
Size: Integer ;
Name: string ;
end ;
|
Функция TransmitFile и буфер с информацией, которая посылается до и после отправки файла:
Код:
1 2 3 4 5 6 7 8 9 10 11 12 | 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;
|
Заполняется заголовок и буфер. Затем идет отправка файла:
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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);
...
|
На сервере имя файла принимается так:
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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 находится некорректная строка, хотя размер файла приходит верный. Вопрос: как правильно отправить/принять имя файла?