`Socket.receive` providing arbitrary packet sizes and hanging without sending EOF
Unazed Spectaculum
unazed at spec.org
Wed Dec 13 19:39:44 UTC 2017
ubyte[] receiveBytes(T)(T socket, size_t receiveCount)
{
ubyte[] buffer = new ubyte[receiveCount];
size_t count = socket.receive(buffer);
return buffer[0 .. count];
}
string receiveAll(T)(T socket, size_t segmentSize = 1024)
{
ubyte[][] data;
size_t count = 0;
do
{
debug(1) writefln("Chunk %s", count);
data ~= receiveBytes(socket, segmentSize);
writeln(data[count]);
if (!data)
break;
} while(data[count++]);
char[] stringData;
foreach (elem; data)
stringData ~= elem;
debug(1) writeln(`Exiting "receiveAll"`);
return to!string(stringData);
}
I've tried many variations of the above code; both with the
retrieve integrated into the do-while loop in receiveAll; however
I was just seeing whether abstracting the code would let me spot
my issues a bit faster because it won't require me to make two
variables for the buffer and amount of bytes received, more like
the typical interface you get.
Issue is; when receiving any size buffer from the end-point
(tested with >1024 byte and <1024 byte buffers); there is always
a superfluous chunk which is awaiting data.
Listening: 0.0.0.0:6969
Client: somebody:58769
Chunk 0
[123, 34, 109, 101, 116, 104, 111, 100, 34, 58, 32, 34, 114, 101,
116, 114, 105, 101, 118, 101, 34, 44, 32, 34, 102, 105, 108, 101,
110, 97, 109, 101, 34, 58, 32, 34, 51, 48, 50, 54, 57, 50, 48,
49, 55, 50, 51, 54, 56, 54, 57, 49, 50, 49, 95, 97, 97, 97, 97,
97, 34, 44, 32, 34, 100, 97, 116, 97, 34, 58, 32, 34, 34, 125]
Chunk 1
[PAUSE]
Listening: 0.0.0.0:6969
Client: somebody:58767
Chunk 0
[123, 34, 109, 101, 116, 104, 111, 100, 34, 58, 32, 34, 114, 101,
116, 114, 105, 101, 118, 101, 34, 44, 32, 34, 102, 105, 108, 101,
110, 97, 109, 101, 34, 58, 32, 34, ... 97]
Chunk 1
[97, ... 125]
Chunk 2
[PAUSE]
No matter what way I try; my code doesn't seem to know when to
quit regardless of the check. Also for the arbitrary packet
sizes, I would've expected that if I received N bytes X times,
the first X-1 times would be perfectly N not some unusual integer.
Simply put, say I'm receiving 1024 bytes 5 times. The length of
each item on the stack looks like:
[720,
490,
1024,
103
]
Although I'd assume it'd be more like:
[1024,
1024,
289
]
What's up with this? It makes working with sockets so damn
tedious since there's no room for assumptions; can anybody
suggest an abstracted library for sockets in D or help with my
former issue?
More information about the Digitalmars-d-learn
mailing list