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?

Reply via email to