On Sun, 19 Oct 2014 03:04:28 GMT, Etienne Cimon wrote:
How about changing the loop to
while(_connection.dataAvailableForRead)
? I doubt you'd ever block if you used that.
Thanks for the help. I tried dataAvailableForRead
again but always returns false
. It doesn't resolve the problem.
Not sure about leastSize maxing out at 4096, that seems very unlikely. How did you measure it?
I inserted writeln
to after leastSize
.
ubyte[] result;
do {
writeln("before leastSize");
auto size = input.leastSize;
writeln("size: ", size);
if (size == 0) {
proccessRequest(result);
break;
}
ubyte[] data = new ubyte[](size);
input.read(data);
result ~= data;
} while (_connection.connected);
My test code:
- test_server.d
import msgpackrpc;
import std.stdio;
import std.array, std.range, std.conv;
class HelloServer
{
size_t len;
this(size_t l)
{
len = l;
}
string hello(string msg)
{
return cast(string)array(repeat('f', len));
}
}
void main(string[] args)
{
auto len = to!size_t(args[1]);
auto server = new TCPServer!(HelloServer)(new HelloServer(len));
server.listen(Endpoint(18800, "127.0.0.1"));
server.start();
}
- test_client.d
import msgpackrpc;
import std.stdio;
import std.array, std.range;
void main()
{
auto client = new TCPClient(Endpoint(18800, "127.0.0.1"));
// sync request
writeln(client.call!string("hello", array(repeat('f', 4100))).length);
}
The result is
before leastSize
size: 4096
before leastSize
size: 11
before leastSize
# blocking until server terminated