DataFlex
DataFlex
ReceiveSb Returns Only the Immediately Available Data
See more Socket/SSL/TLS Examples
Demonstrates that Socket.ReceiveSb returns only the data immediately available and not the entire response. The example connects to chilkatsoft.com over TLS and requests big_helloWorld.txt, a large text file of roughly 74,000 lines. A single ReceiveSb call returns just the first portion of the response, and the example reports how many characters were received compared with the total size given by the response Content-Length header.
Background. Because ReceiveSb returns whatever bytes are currently available, one call cannot indicate whether the full response has arrived. Knowing when a response is complete requires either a known expected length (such as a Content-Length header or an application-defined length prefix), receiving in a loop until that many bytes are collected, or receiving until the peer closes the connection. This example sends a minimal HTTP request only to exercise ReceiveSb against a public server; for actual HTTP work, use the Chilkat Http, Rest, or HttpCurl classes.
Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoSocket
Boolean iBTls
Integer iMaxWaitMs
String sHttpReq
Variant vSb
Handle hoSb
String sContentLength
String sTemp1
Integer iTemp1
Boolean bTemp1
Move False To iSuccess
Get Create (RefClass(cComChilkatSocket)) To hoSocket
If (Not(IsComObjectCreated(hoSocket))) Begin
Send CreateComObject of hoSocket
End
// Connect to chilkatsoft.com over TLS.
Move True To iBTls
Move 5000 To iMaxWaitMs
Get ComConnect Of hoSocket "chilkatsoft.com" 443 iBTls iMaxWaitMs To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoSocket To sTemp1
Showln sTemp1
Procedure_Return
End
Set ComStringCharset Of hoSocket To "utf-8"
// Send an HTTP GET request for big_helloWorld.txt, a large text file of roughly 74,000 lines of
// "Hello World!". This uses a minimal HTTP request only to exercise ReceiveSb against a public
// server -- for real HTTP work, use the Chilkat Http, Rest, or HttpCurl classes instead.
Move "GET /big_helloWorld.txt HTTP/1.1" + (character(13)) + (character(10)) + "Host: chilkatsoft.com" + (character(13)) + (character(10)) + "Connection: close" + (character(13)) + (character(10)) + (character(13)) + (character(10)) To sHttpReq
Get ComSendString Of hoSocket sHttpReq To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoSocket To sTemp1
Showln sTemp1
Procedure_Return
End
// Call ReceiveSb a single time. It returns only the bytes that are immediately available --
// typically just the first network packet -- and does NOT wait for the entire response to arrive.
Get Create (RefClass(cComChilkatStringBuilder)) To hoSb
If (Not(IsComObjectCreated(hoSb))) Begin
Send CreateComObject of hoSb
End
Get pvComObject of hoSb to vSb
Get ComReceiveSb Of hoSocket vSb To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoSocket To sTemp1
Showln sTemp1
Procedure_Return
End
// The response begins with HTTP headers. The Content-Length header gives the total size, in bytes,
// of the response body.
Get ComGetBetween Of hoSb "Content-Length: " (character(13)) + (character(10)) To sContentLength
Get ComLastMethodSuccess Of hoSb To bTemp1
If (bTemp1 = False) Begin
Get ComLastErrorText Of hoSb To sTemp1
Showln sTemp1
Procedure_Return
End
// Compare what this single ReceiveSb returned against the full size of the expected response. The
// received amount is only a small fraction of the total.
Get ComLength Of hoSb To iTemp1
Showln "Characters received so far (headers + partial body): " iTemp1
Showln "Expected response body size (Content-Length): " sContentLength " bytes"
// A single ReceiveSb call returns whatever is currently available, so it cannot indicate whether the
// full response has arrived. This makes it difficult to know when a response is complete: the
// application must either know how many bytes to expect (for example from a Content-Length header or
// an application-defined length prefix) and keep receiving until that many bytes are collected, or
// keep receiving until the peer closes the connection.
End_Procedure