Type | Bug | Status | submitted | Date | 14-Jan-2014 18:05 |
---|---|---|---|---|---|
Version | r3 master | Category | Ports | Submitted by | szeng |
Platform | All | Severity | minor | Priority | normal |
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 to | n/a | Fixed in | - | Last Update | 22-Feb-2014 19:38 |
---|
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 | - |