Sample code for 30+ languages & platforms
Visual FoxPro

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 Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loSocket
LOCAL lnBTls
LOCAL lnMaxWaitMs
LOCAL lcHttpReq
LOCAL loSb
LOCAL lcContentLength

lnSuccess = 0

loSocket = CreateObject('Chilkat.Socket')

*  Connect to chilkatsoft.com over TLS.
lnBTls = 1
lnMaxWaitMs = 5000
lnSuccess = loSocket.Connect("chilkatsoft.com",443,lnBTls,lnMaxWaitMs)
IF (lnSuccess = 0) THEN
    ? loSocket.LastErrorText
    RELEASE loSocket
    CANCEL
ENDIF

loSocket.StringCharset = "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.
lcHttpReq = "GET /big_helloWorld.txt HTTP/1.1" + CHR(13) + CHR(10) + "Host: chilkatsoft.com" + CHR(13) + CHR(10) + "Connection: close" + CHR(13) + CHR(10) + CHR(13) + CHR(10)
lnSuccess = loSocket.SendString(lcHttpReq)
IF (lnSuccess = 0) THEN
    ? loSocket.LastErrorText
    RELEASE loSocket
    CANCEL
ENDIF

*  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.
loSb = CreateObject('Chilkat.StringBuilder')
lnSuccess = loSocket.ReceiveSb(loSb)
IF (lnSuccess = 0) THEN
    ? loSocket.LastErrorText
    RELEASE loSocket
    RELEASE loSb
    CANCEL
ENDIF

*  The response begins with HTTP headers.  The Content-Length header gives the total size, in bytes,
*  of the response body.
lcContentLength = loSb.GetBetween("Content-Length: ",CHR(13) + CHR(10))
IF (loSb.LastMethodSuccess = 0) THEN
    ? loSb.LastErrorText
    RELEASE loSocket
    RELEASE loSb
    CANCEL
ENDIF

*  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.
? "Characters received so far (headers + partial body): " + STR(loSb.Length)
? "Expected response body size (Content-Length): " + lcContentLength + " 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.

RELEASE loSocket
RELEASE loSb