如何从 D 中的套接字获取字符串输入?

How to get string input from a socket in D?

我正在使用这段代码来监听一个端口:

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;
    }

据我所知,套接字与字节交互。我想找到一种方法将这些字节(本质上是 SQL 请求)转换为字符串。如果输入是 UTF-8,这是一种使用可变大小的编码,我该怎么做?

试试这个:

导入std.exception:假设唯一;

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

你似乎有几个问题。

How do I get chars from bytes?

  1. cast(char[]) st 投射它们。这给字节别名,给你一片完全相同的数据,并且不需要新的分配。您还没有假设字节是有效的 UTF-8,但如果不是,自动解码或程序的其他部分可能会抱怨。如果需要,您可以 运行 std.utf.validate

  2. std.string.assumeUTF(st) 做基本相同的事情,它至少也断言无效的 UTF 仅在调试版本中。

How do I get a string from char[]?

您可以使用 std.exception.assumeUnique(st) 不安全地为 char[] 添加别名,或者您可以使用 st.idupstd.utf.toUTF8(st).

分配不可变副本

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

如果这是一个风险,您可以使用低级 std.utf 工具(decodeFront 并捕获 UTFException 是一种方法)剥离有效的 UTF-8,然后检查您是否有剩余字节,或检查输入的结尾是否为有效的 UTF-8。

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

您可以定义一个网络协议,其中包含语句大小等信息,或者具有您可以阅读的 'end of statement' 标记,而不是仅通过线路传递原始 SQL 语句。

我有一个 cheat sheet 用于字符串类型转换,它链接到一个包含更详细的单元测试的文件。