AltME: R3 Protocols

Messages

GrahamC
could be
tcp-port/awake: :awake-handler
so, your example could be
rp: open redis://192.168.2.11:10
write rp [ SET asynctest true ]
wait [ rp 3 ]
Rebolek
This doesn't help, it's still stuck in the wait loop, even with the change from ASYNC-HANDLER to AWAKE-HANDLER.

Rebolek
During redis:// test I crashed Rebol with "#9910: unspecific" error. I'll try to isolate the problem (but I guess it needs lots of reads and writes on TCP port). Has anybody seens this error before?
GrahamC
I've seen unspecific errors before but never recorded which ones

Rebolek
How can I read multiple TCP responses to one request? When I WAIT on port, I get first response and I can see with Wireshar other responses were sent also, but how do I access hem from Rebol?

Cyphre
Rebolek: I guess you need to implement your own awake handler for that.
(You might also check here for some tcp examples: http://www.rebol.net/wiki/Port_Examples#TCP_Network_Examples)
Rebolek
I'm writing my own awake handler for this, I just don't know how should to deal with his situation :)
his=this
Cyphre
hmm, not sure what is the problem...you should be able to handle that situation using the READ/WROTE events, no?
Rebolek
So should there be some loop in READ event?
something like until some-mysterious-condition [copy port/data] ?
Cyphre
I think first you need to know how much you read already, how much is left to read, if you are at the end of the response or not etc. and build logic around that in the awake handler. What protocol are you trying implement?
Also look at the examples...I don't remeber it from my head directly but you can either read or write on the port from the READ event depending if you want to wait for more data or send something to the server etc. It all depends on the protocol definiton.

Gabriele
Rebolek, IIRC you just call READ again on the port if you want to read more in the 'read event. That will trigger a new 'read event once new data is ready. You should check existing examples (eg. HTTP), I don't know what the state of the documentation is.

Rebolek
Gabriele, Cyphre, see this gist. https://gist.github.com/rebolek/8858338 It returns first line but when I call read again it just waits and does nothing.
Gabriele
What I meant is, that in the 'read event:
    read [
        port/spec/data: copy port/data
        clear port/data
        return true
    ]
you need a way to know if more data is needed (or, simply assume more data is always needed) and call read again, eg:
    read [
        port/spec/data: copy port/data
        clear port/data
        read port
        return true
    ]
this will trigger a new 'read event where you call COPY again etc.
This is from memory so I might be wrong.
Gabriele
For example, in the HTTP scheme, in the 'read event I call the check-response function, which determines if more data is needed (do we have all the headers? do we need content data? etc.) and calls READ on the port accordingly.
actually, I think that returning TRUE from the 'read event means "we are done, no more data to read", which signals the higher level READ to return your data. But, I might be wrong here, I don't remember the details.
Rebolek
Ah, OK, so calling READ from READ. I will try that. Thanks.
Cyphre
Yes, I think Gabriele is right...you need to call READ action from READ event. AFAIK you can also WRITE on port from READ event to send some data to server if necessary...etc.  It depends on the protocol spec/logic you need to follow.

Last message posted 155 weeks ago.