Доброго времени суток!
Имеется своя запись для хранения длины имени файла и самого имени:
Код:
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 находится некорректная строка, хотя размер файла приходит верный. Вопрос: как правильно отправить/принять имя файла?