Reputation: 3497
I try to send a file via sendtext but i can't upload more than 4kb I send the file via base64 and a string:
ServerSocket1.Socket.Connections[listview1.Selected.index].Sendtext('FILE<-+^+->' + encodefile(edit4.text));
The encodefile script is:
function EncodeFile(const FileName: string): AnsiString;
var
stream: TMemoryStream;
begin
stream := TMemoryStream.Create;
try
stream.LoadFromFile(Filename);
result := EncodeBase64(stream.Memory, stream.Size);
finally
stream.Free;
end;
end;
Under the 4kb it works perfect how can i fix this?
Upvotes: 1
Views: 775
Reputation: 596206
Like any other socket operation, SendText()
is not guaranteed to transfer the entire requested data in a single operation, even when using the socket in blocking mode. The return value reports how many bytes, not characters were actually accepted. If the return value is smaller than your data, you have to call SendText()
again for the remaining unsent data. So you need to call SendText()
(actually, it is better to use SendBuf()
directly) in a loop, eg:
uses
..., ScktComp, Winsock;
function SendTextToSocket(Socket: TCustomWinSocket; const S: AnsiString): Boolean;
var
Data: PAnsiChar;
DataLen, Sent: Integer;
begin
Result := False;
Data := PAnsiChar(S);
DataLen := Length(S);
while DataLen > 0 do
begin
Sent := Socket.SendBuf(Data^, DataLen);
if Sent = SOCKET_ERROR then
begin
if WSAGetLastError <> WSAEWOULDBLOCK then
Exit;
end
else if Sent = 0 then
begin
Exit;
end else
begin
Inc(Data, Sent);
Dec(DataLen, Sent);
end;
end;
Result := True;
end;
SendTextToSocket(ServerSocket1.Socket.Connections[ListView1.Selected.Index], 'FILE<-+^+->' + EncodeFile(Edit4.Text));
Upvotes: 2