Skip to content

Instantly share code, notes, and snippets.

@cyphre
Last active August 29, 2015 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save cyphre/cea23da299e8ffce24e0 to your computer and use it in GitHub Desktop.
Save cyphre/cea23da299e8ffce24e0 to your computer and use it in GitHub Desktop.
REBOL [
title: "Example simple TCP client<->server data transfer"
author: ["Richard Smolak" "Andreas Bolka"]
]
;enable for verbose mode
debug: none ;:print
;lenght in bytes of test data we transfer
data-len: 10'000'000
;transfer data chunk value
chunk-len: 32'000
last-len: 0
t0: none
ports: copy []
if any [none? system/options/args find system/options/args "server"] [
print ";; Starting server"
s: open tcp://:8080
use [s-len s-data][
s/awake: func [event /local con] [
debug ['server event/type]
if event/type = 'accept [
con: first event/port
con/awake: func [event /local port data len] [
debug ['server-connection event/type]
port: event/port
switch event/type [
read [
data: port/data
len: length? data
debug ["server received" len "of" data-len "bytes (" len - last-len ")"]
last-len: len
either len < data-len [
read port
][
print "All data transferred to server succesfully"
s-data: copy data
clear port/data
print "Server WRITE BEGIN"
s-len: 0
last-len: 0
t0: stats/timer
write port take/part s-data chunk-len
]
]
wrote [
s-len: s-len + chunk-len
either s-len < data-len [
write port take/part s-data chunk-len
][
print ["Server WRITE END" stats/timer - t0]
close port
return true
]
]
close [
close port
return true
]
]
false
]
read con
]
false
]
]
append ports s
]
if any [none? system/options/args find system/options/args "client"] [
print ";; Starting client"
c: open tcp://127.0.0.1:8080
use [c-len c-data][
c-data: head insert/dup #{} 0 data-len
c/awake: func [event /local port data len] [
debug ['client event/type]
port: event/port
switch event/type [
read [
data: port/data
len: length? data
debug ["client received" len "of" data-len "bytes (" len - last-len ")"]
last-len: len
either len < data-len [
read port
][
print "All data transferred back to client succesfully"
data: copy data
clear port/data
;finish
close port
return true
]
]
wrote [
c-len: c-len + chunk-len
either c-len < data-len [
write port take/part c-data chunk-len
][
print ["Client WRITE END" stats/timer - t0]
read port
]
]
close [
close port
return true
]
lookup [open port]
connect [
print "Client WRITE BEGIN"
c-len: 0
last-len: 0
t0: stats/timer
write port take/part c-data chunk-len
]
]
false
]
]
append ports c
]
wait ports
halt
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment