Sample code for 30+ languages & platforms
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

DataFlex
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