DataFlex
DataFlex
Transfer a File using Sockets (TLS or non-TLS)
See more Socket/SSL/TLS Examples
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.Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Variant vBdToSend
Handle hoBdToSend
Handle hoSndSock
Boolean iBUseTls
Integer iPort
Integer iMaxWaitMs
Integer iNumBytes
Boolean iBBigEndian
Handle hoListenSock
Variant vRcvSock
Handle hoRcvSock
Integer iNumBytesComing
Variant vBdReceived
Handle hoBdReceived
Integer iMaxWaitMs
String sTemp1
Integer iTemp1
Move False To iSuccess
// 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.
Get Create (RefClass(cComChilkatBinData)) To hoBdToSend
If (Not(IsComObjectCreated(hoBdToSend))) Begin
Send CreateComObject of hoBdToSend
End
Get ComLoadFile Of hoBdToSend "somePath/someFile.dat" To iSuccess
// Assume success for the example...
Get Create (RefClass(cComChilkatSocket)) To hoSndSock
If (Not(IsComObjectCreated(hoSndSock))) Begin
Send CreateComObject of hoSndSock
End
Move True To iBUseTls
Move 5555 To iPort
Move 5000 To iMaxWaitMs
Get ComConnect Of hoSndSock "some_domain_or_ip.com" iPort iBUseTls iMaxWaitMs To iSuccess
// Assume success for the example...
// Tell the receiver how many bytes are coming.
Get ComNumBytes Of hoBdToSend To iNumBytes
Move True To iBBigEndian
Get ComSendInt32 Of hoSndSock iNumBytes iBBigEndian To iSuccess
// Send the file data (sends the entire contents of bdToSend).
Get pvComObject of hoBdToSend to vBdToSend
Get ComSendBd Of hoSndSock vBdToSend 0 0 To iSuccess
// Get an acknowledgement.
Get ComReceiveInt32 Of hoSndSock iBBigEndian To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoSndSock To sTemp1
Showln sTemp1
Procedure_Return
End
// Did the receiver get the correct number of bytes?
Get ComReceivedInt Of hoSndSock To iTemp1
If (iTemp1 <> iNumBytes) Begin
Showln "The receiver did not acknowledge with the correct number of bytes."
Procedure_Return
End
Showln "File sent!"
// ------------------------------------------------------------------------------------
// The code below is for the receiving side (running on some other computer..)
Get Create (RefClass(cComChilkatSocket)) To hoListenSock
If (Not(IsComObjectCreated(hoListenSock))) Begin
Send CreateComObject of hoListenSock
End
Get ComBindAndListen Of hoListenSock 5555 25 To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoListenSock To sTemp1
Showln sTemp1
Procedure_Return
End
// Get the next incoming connection
// Wait a maximum of 20 seconds (20000 millisec)
Get Create (RefClass(cComChilkatSocket)) To hoRcvSock
If (Not(IsComObjectCreated(hoRcvSock))) Begin
Send CreateComObject of hoRcvSock
End
Get pvComObject of hoRcvSock to vRcvSock
Get ComAcceptNext Of hoListenSock 20000 vRcvSock To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoListenSock To sTemp1
Showln sTemp1
Procedure_Return
End
// The sender will first send the big-endian integer for the number of bytes
// that are forthcoming..
Get ComReceiveInt32 Of hoRcvSock iBBigEndian To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoRcvSock To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComReceivedInt Of hoRcvSock To iNumBytesComing
// Receive that many bytes..
Get Create (RefClass(cComChilkatBinData)) To hoBdReceived
If (Not(IsComObjectCreated(hoBdReceived))) Begin
Send CreateComObject of hoBdReceived
End
Get pvComObject of hoBdReceived to vBdReceived
Get ComReceiveBdN Of hoRcvSock iNumBytesComing vBdReceived To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoRcvSock To sTemp1
Showln sTemp1
Procedure_Return
End
// Acknowledge the sender by sending back the number of bytes we received.
Get ComNumBytes Of hoBdReceived To iTemp1
Get ComSendInt32 Of hoRcvSock iTemp1 iBBigEndian To iSuccess
// Close the connection.
Move 20 To iMaxWaitMs
Get ComClose Of hoRcvSock iMaxWaitMs To iSuccess
// Save the received data to a file.
Get ComWriteFile Of hoBdReceived "somePath/someFile.dat" To iSuccess
// Assume success for the example...
Showln "File received!"
End_Procedure