Sample code for 30+ languages & platforms
Tcl

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 Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

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

set sock [new_CkSocket]

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

set useTls 0
set port 4242
set maxWaitMs 5000
set success [CkSocket_Connect $sock "tcpbin.com" $port $useTls $maxWaitMs]
if {$success == 0} then {
    puts [CkSocket_lastErrorText $sock]
    delete_CkSocket $sock
    exit
}

# Wait a max of 2 seconds for a response..
CkSocket_put_MaxReadIdleMs $sock 2000

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

# The tcpbin.com echo server only echoes after receiving an LF (linefeed char)
CkSocket_SendByte $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.)
set hexStr [CkSocket_receiveNBytesENC $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.
puts "Expecting big-endian 2EF6"
puts "$hexStr"

# Let's read directly to an integer..
set success [CkSocket_ReceiveInt16 $sock $bigEndian 1]
puts "Expecting 12022"
puts "Received: [CkSocket_get_ReceivedInt $sock]"

# Consume the LF that gets echoed back..
CkSocket_ReceiveByte $sock 1

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

puts "----"

# 12022 decimal = 2EF6 hex, but little-endian byte ordering will send the bytes in the order 0xF6 0x2E
set value 12022
set bigEndian 0
CkSocket_SendInt16 $sock $value $bigEndian
CkSocket_SendInt16 $sock $value $bigEndian
CkSocket_SendByte $sock 10

set hexStr [CkSocket_receiveNBytesENC $sock 2 "hex"]

puts "Expecting little-endian F62E"
puts "$hexStr"

set success [CkSocket_ReceiveInt16 $sock $bigEndian 1]
puts "Expecting 12022"
puts "Received: [CkSocket_get_ReceivedInt $sock]"

# Consume the LF that gets echoed back..
CkSocket_ReceiveByte $sock 1

CkSocket_Close $sock 1000

# Output:

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

delete_CkSocket $sock