Sample code for 30+ languages & platforms
PureBasic

Socket Send/Receive 16-bit Integers

Demonstrates sending and receiving 16-bit integers over a socket connection using either big-endian or little-endian byte ordering.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkSocket.pb"

Procedure ChilkatExample()

    success.i = 0

    ; This example requires the Chilkat API to have been previously unlocked.
    ; See Global Unlock Sample for sample code.

    sock.i = CkSocket::ckCreate()
    If sock.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; --------------------------------------------------------------------
    ; This example uses the public TCP echo service at https://tcpbin.com/
    ; --------------------------------------------------------------------

    useTls.i = 0
    port.i = 4242
    maxWaitMs.i = 5000
    success = CkSocket::ckConnect(sock,"tcpbin.com",port,useTls,maxWaitMs)
    If success = 0
        Debug CkSocket::ckLastErrorText(sock)
        CkSocket::ckDispose(sock)
        ProcedureReturn
    EndIf

    ; Wait a max of 2 seconds for a response..
    CkSocket::setCkMaxReadIdleMs(sock, 2000)

    ; Send a 16-bit integer using big-endian byte ordering (also called network byte order)
    ; 12022 decimal = 2EF6 hex
    value.i = 12022
    bigEndian.i = 1
    CkSocket::ckSendInt16(sock,value,bigEndian)
    ; Send it again, because we'll read it two different ways..
    CkSocket::ckSendInt16(sock,value,bigEndian)

    ; The tcpbin.com echo server only echoes after receiving an LF (linefeed char)
    CkSocket::ckSendByte(sock,10)

    ; Let's see hex values of the 2 bytes sent in network byte order (big-endian)
    ; (The echo server sends back exactly the bytes received.)
    hexStr.s = CkSocket::ckReceiveNBytesENC(sock,2,"hex")

    ; In the big-ending byte order, the byte order is most significant byte to least significant,
    ; therefore we should see the bytes in the order 0x2E 0xF6.
    Debug "Expecting big-endian 2EF6"
    Debug hexStr

    ; Let's read directly to an integer..
    success = CkSocket::ckReceiveInt16(sock,bigEndian,1)
    Debug "Expecting 12022"
    Debug "Received: " + Str(CkSocket::ckReceivedInt(sock))

    ; Consume the LF that gets echoed back..
    CkSocket::ckReceiveByte(sock,1)

    ; --------------------------------------------------------------------
    ; Let's do the same thing, but with little-endian byte ordering.

    Debug "----"

    ; 12022 decimal = 2EF6 hex, but little-endian byte ordering will send the bytes in the order 0xF6 0x2E
    value = 12022
    bigEndian = 0
    CkSocket::ckSendInt16(sock,value,bigEndian)
    CkSocket::ckSendInt16(sock,value,bigEndian)
    CkSocket::ckSendByte(sock,10)

    hexStr = CkSocket::ckReceiveNBytesENC(sock,2,"hex")

    Debug "Expecting little-endian F62E"
    Debug hexStr

    success = CkSocket::ckReceiveInt16(sock,bigEndian,1)
    Debug "Expecting 12022"
    Debug "Received: " + Str(CkSocket::ckReceivedInt(sock))

    ; Consume the LF that gets echoed back..
    CkSocket::ckReceiveByte(sock,1)

    CkSocket::ckClose(sock,1000)

    ; Output:

    ; Expecting big-endian 2EF6
    ; 2EF6
    ; Expecting 12022
    ; Received: 12022
    ; ----
    ; Expecting little-endian F62E
    ; F62E
    ; Expecting 12022
    ; Received: 12022


    CkSocket::ckDispose(sock)


    ProcedureReturn
EndProcedure