![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Доброго времени суток!
Имеется своя запись для хранения длины имени файла и самого имени: Код:
PHeader = ^THeader; THeader = record Size: Integer; Name: string; end; Код:
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; Последний раз редактировалось Blightn, 02.11.2013 в 17:09. |