Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Delphi DLL) Transfer a File using Sockets (TLS or non-TLS)Demonstrates how to two programs, one a socket writer and the other a socket reader, can transfer a file. The connection can be TLS or a regular non-encrypted TCP connection.
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, BinData, Socket; ... procedure TForm1.Button1Click(Sender: TObject); var bdToSend: HCkBinData; success: Boolean; sndSock: HCkSocket; bUseTls: Boolean; port: Integer; maxWaitMs: Integer; numBytes: Integer; bBigEndian: Boolean; listenSock: HCkSocket; rcvSock: HCkSocket; numBytesComing: Integer; bdReceived: HCkBinData; maxWaitMs: Integer; begin // This example requires the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. // On the sending side, we'll load the file into a BinData object and send. // On the receiving side, we'll read from the socket connection into a BinData, and save to a file. // This example assumes the file is not crazy-large, and that the entire contents // can fit into memory. // (If the file is too large for memory, there are other ways to send. It just involves streaming or // sending the file chunk-by-chunk..) // This section of code is for the sender. bdToSend := CkBinData_Create(); success := CkBinData_LoadFile(bdToSend,'somePath/someFile.dat'); // Assume success for the example... sndSock := CkSocket_Create(); bUseTls := True; port := 5555; maxWaitMs := 5000; success := CkSocket_Connect(sndSock,'some_domain_or_ip.com',port,bUseTls,maxWaitMs); // Assume success for the example... // Tell the receiver how many bytes are coming. numBytes := CkBinData_getNumBytes(bdToSend); bBigEndian := True; success := CkSocket_SendInt32(sndSock,numBytes,bBigEndian); // Send the file data (sends the entire contents of bdToSend). success := CkSocket_SendBd(sndSock,bdToSend,0,0); // Get an acknowledgement. success := CkSocket_ReceiveInt32(sndSock,bBigEndian); if (success <> True) then begin Memo1.Lines.Add(CkSocket__lastErrorText(sndSock)); Exit; end; // Did the receiver get the correct number of bytes? if (CkSocket_getReceivedInt(sndSock) <> numBytes) then begin Memo1.Lines.Add('The receiver did not acknowledge with the correct number of bytes.'); Exit; end; Memo1.Lines.Add('File sent!'); // ------------------------------------------------------------------------------------ // The code below is for the receiving side (running on some other computer..) listenSock := CkSocket_Create(); success := CkSocket_BindAndListen(listenSock,5555,25); if (success <> True) then begin Memo1.Lines.Add(CkSocket__lastErrorText(listenSock)); Exit; end; // Get the next incoming connection // Wait a maximum of 20 seconds (20000 millisec) rcvSock := CkSocket_AcceptNextConnection(listenSock,20000); if (CkSocket_getLastMethodSuccess(listenSock) = False) then begin Memo1.Lines.Add(CkSocket__lastErrorText(listenSock)); Exit; end; // The sender will first send the big-endian integer for the number of bytes // that are forthcoming.. success := CkSocket_ReceiveInt32(rcvSock,bBigEndian); if (success <> True) then begin Memo1.Lines.Add(CkSocket__lastErrorText(rcvSock)); CkSocket_Dispose(rcvSock); Exit; end; numBytesComing := CkSocket_getReceivedInt(rcvSock); // Receive that many bytes.. bdReceived := CkBinData_Create(); success := CkSocket_ReceiveBdN(rcvSock,numBytesComing,bdReceived); if (success <> True) then begin Memo1.Lines.Add(CkSocket__lastErrorText(rcvSock)); CkSocket_Dispose(rcvSock); Exit; end; // Acknowledge the sender by sending back the number of bytes we received. success := CkSocket_SendInt32(rcvSock,CkBinData_getNumBytes(bdReceived),bBigEndian); // Close the connection. maxWaitMs := 20; CkSocket_Close(rcvSock,maxWaitMs); CkSocket_Dispose(rcvSock); // Save the received data to a file. success := CkBinData_WriteFile(bdReceived,'somePath/someFile.dat'); // Assume success for the example... Memo1.Lines.Add('File received!'); CkBinData_Dispose(bdToSend); CkSocket_Dispose(sndSock); CkSocket_Dispose(listenSock); CkBinData_Dispose(bdReceived); end; |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.