REBOL3 tracker
  0.9.12 beta
Ticket #0002098 User: anonymous

Project:



rss
TypeBug Statussubmitted Date14-Jan-2014 18:05
Versionr3 master CategoryPorts Submitted byszeng
PlatformAll Severityminor Prioritynormal

Summary Writing to port writes garbages at the end
Description Port writing sends data in chunks of 32000 bytes, but it doesn't check the length of last chunk, so if the length of the data is longer than 32000 and not multiple of 32000, it will some garbages at the end.

The patch to fix this problem:

diff --git a/src/os/dev-net.c b/src/os/dev-net.c
index 6eab425..e053262 100644
--- a/src/os/dev-net.c
+++ b/src/os/dev-net.c
@@ -432,7 +432,7 @@ static REBOOL Nonblocking_Mode(SOCKET sock)
SET_FLAG(sock->state, mode);

// Limit size of transfer:
- len = MIN(sock->length, MAX_TRANSFER);
+ len = MIN(sock->length - sock->actual, MAX_TRANSFER);

if (mode == RSM_SEND) {
// If host is no longer connected:
Example code
server:

REBOL []
wait-list: copy [10]
server: open tcp://:8888
server/awake: funct [
	evt [event!]
][
	switch evt/type [
		accept [
			open-client-port first evt/port
			return true
		]
	]
	false
]

open-client-port: func [
	port [port!]
][
	port/awake: func [
		evt
	][
		switch evt/type [
			read [
				print ["data read from port " length? evt/port/data]
				write/append %received.txt evt/port/data
				clear evt/port/data
				read evt/port
			]
			wrote [
				print "data written to port"
				print ["length of data:" length? evt/port/data]
				read evt/port
			]
			close [
				print "port closed"
			]
		]
		false
	]
	insert wait-list port
	read port
]

insert wait-list server
forever [
	wait wait-list
]

client:
REBOL []
port: open tcp://localhost:8888
port/awake: func [
	evt
][
	switch evt/type [
		lookup [ print ["ip of the server found"] open evt/port]
		connect [print "connected to display server" return true ]
		read [
			print ["data read from display port " length? evt/port/data]
			read evt/port
		]
		wrote [
			print "data written to display port"
			print ["length of data:" length? evt/port/data]
			read evt/port
			;return true
		]
		close [
			print "display port closed"
		]
	]
	false
]

wait [port 30]

data: to binary! "1"
while [(length? data) < 32001][ append data "1"]
write port data
forever [
	print ["wait returned with" wait [port 30]]
]

Assigned ton/a Fixed in- Last Update22-Feb-2014 19:38


Comments

Date User Field Action Change
22-Feb-2014 19:38 Ladislav Description Modified -
22-Feb-2014 19:38 Ladislav Code Modified -
22-Feb-2014 19:38 Ladislav Category Modified Unspecified => Ports
14-Jan-2014 18:05 szeng Ticket Added -