Tannenfels
Tannenfels

Reputation: 58

How to get string input from a socket in D?

I'm using this code to listen to a port:

int start(){
        ushort port = 61888;
        listener = new TcpSocket();
        assert(listener.isAlive);
        listener.blocking = false;
        listener.bind(new InternetAddress(port));
        listener.listen(10);
        writefln("Listening on port %d.", port);

        enum MAX_CONNECTIONS = 60;
        auto socketSet = new SocketSet(MAX_CONNECTIONS + 1);
        Socket[] reads;
        while (true)
        {
            socketSet.add( listener);

            foreach (sock; reads)
                socketSet.add(sock);

            Socket.select(socketSet, null, null);

           

        }

        return 0;
    }

As far as I know, sockets interact with the bytes as they are. I want to find a way how to convert these bytes (which are essentially SQL requests) to strings. How can I do so, providing that input is in UTF-8, which is an encoding using variable size?

Upvotes: 1

Views: 119

Answers (2)

Julian Fondren
Julian Fondren

Reputation: 5619

You seem to have a few questions here.

How do I get chars from bytes?

  1. cast them with cast(char[]) st. This aliases the bytes, giving you a slice of the exact same data, and doesn't require new allocation. You are not yet assuming that the bytes are valid UTF-8, but autodecoding or other parts of your program might complain if they aren't. You can run it by std.utf.validate if you want.

  2. do basically the same thing with std.string.assumeUTF(st), which at least also asserts on invalid UTF in debug builds only.

How do I get a string from char[]?

You can unsafely alias the char[] with std.exception.assumeUnique(st), or you can allocate an immutable copy with st.idup or std.utf.toUTF8(st).

What if my fixed buffer of bytes contains invalid UTF-8 -- because it got cut off?

If that's a risk you can use low level std.utf tools (decodeFront and catching UTFException is one way) to peel off the valid UTF-8 and then check if you have remaining bytes, or to check that the end of the input is valid UTF-8.

How do I know if I've gotten a complete SQL statement with my fixed buffer socket I/O?

Instead of just passing the raw SQL statement over the line, you can define a network protocol that includes information like statement size, or that has 'end of statement' markers that you can read for.

I've a cheat sheet for string type conversions, which links to a file of more elaborate unittests.

Upvotes: 2

acen28
acen28

Reputation: 56

Try this:

import std.exception: assumeUnique;

string s = assumeUnique (cast(char[])ubyteArray);

Upvotes: 0

Related Questions