diff --git a/src/core/p-net.c b/src/core/p-net.c index c4c77180b2..902fbca223 100644 --- a/src/core/p-net.c +++ b/src/core/p-net.c @@ -217,6 +217,7 @@ enum Transport_Types { //Print("(max read length %d)", sock->length); result = OS_DO_DEVICE(sock, RDC_READ); // recv can happen immediately if (result < 0) Trap_Port(RE_READ_ERROR, port, sock->error); + VAL_TAIL(arg) += sock->actual; break; case A_WRITE: diff --git a/src/tests/test-udp-client.r3 b/src/tests/test-udp-client.r3 new file mode 100644 index 0000000000..ed1977875e --- /dev/null +++ b/src/tests/test-udp-client.r3 @@ -0,0 +1,40 @@ +Rebol [ + Title: "Test UDP client" + File: %test-udp-client.r3 + Note: https://github.com/Oldes/Rebol-issues/issues/1803 +] + +; start test UDP server... +launch probe to-real-file %test-udp-server.r3 + +; wait some time for server to boot... +wait 0:0:0.1 + +stdout: system/ports/output + +; open port for output... +port: open udp://127.0.0.1:1189 +port/awake: func[event][ + print ["[UDP Client] event:" event/type] + ;; console output is buffered and so messages could come out of order; + ;; to prevent it, just use the `flush`! + flush stdout + true +] +; wait for port to be opened (required on Windows!)... +wait port + +write-udp: func[msg [string!]][ + print ["[UDP Client] sending:" as-yellow mold msg] + flush stdout ;= flush console buffer! + write port msg +] +write-udp "Hello" +write-udp "Rebol" +wait 1 ;= pretending some work here... +write-udp "I'm done!" +write-udp "quit" + +either system/options/script [ + ask as-red "CLIENT DONE" +][ print as-red "CLIENT DONE" wait 0.5] diff --git a/src/tests/test-udp-server.r3 b/src/tests/test-udp-server.r3 index 61b4e52894..6a7a89ee2b 100644 --- a/src/tests/test-udp-server.r3 +++ b/src/tests/test-udp-server.r3 @@ -10,18 +10,23 @@ udp-server: try/except [open udp://:1189][ print as-purple "Failed to listen on UDP port 1189!" quit ] +stdout: system/ports/output udp-server/awake: func [event] [ - print ["UDP event:" as-yellow event/type] + print ["[UDP Server] event:" event/type] + ;; console output is buffered and so messages could come out of order; + ;; to prevent it, just use the `flush`! + flush stdout true ] forever [ wait read udp-server str: to string! udp-server/data - print ["UDP input:" as-green mold str] + print ["[UDP Server] received:" as-green mold str] + flush stdout ;= flush console buffer! if str = "quit" [close udp-server break] clear udp-server/data ] -print as-red "SERVER DONE" -wait 0:0:1 \ No newline at end of file + +print as-red "SERVER DONE" \ No newline at end of file diff --git a/src/tests/test-udp.r3 b/src/tests/test-udp.r3 deleted file mode 100644 index 95e7451a3e..0000000000 --- a/src/tests/test-udp.r3 +++ /dev/null @@ -1,23 +0,0 @@ -Rebol [ - Title: "Test UDP client" - File: %test-udp.r3 - Note: https://github.com/Oldes/Rebol-issues/issues/1803 -] - -; start test UDP server... -launch probe to-real-file %test-udp-server.r3 - -; wait some time for server to boot... -wait 0:0:0.1 - -; open port for output... -port: open udp://127.0.0.1:1189 -; wait for port to be opened (required on Windows!)... -wait port -; there seems to be a bug in current implementation where -; message is lost if there is no wait between each write! -write port "Hello" wait 0:0.1 -write port "Rebol" wait 0:0.1 -write port "quit" -print as-red "CLIENT DONE" -wait 0:0:1 \ No newline at end of file