【问题标题】:How to get string input from a socket in D?如何从 D 中的套接字获取字符串输入?
【发布时间】:2021-09-20 16:41:57
【问题描述】:

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

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(使用可变大小的编码),我该怎么做?

【问题讨论】:

    标签: sockets d


    【解决方案1】:

    您在这里似乎有几个问题。

    如何从字节中获取字符?

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

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

    如何从 char[] 中获取字符串?

    您可以不安全地将char[] 别名为std.exception.assumeUnique(st),或者您可以使用st.idupstd.utf.toUTF8(st) 分配一个不可变副本。

    如果我的固定字节缓冲区包含无效的 UTF-8 怎么办——因为它被切断了?

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

    我如何知道我是否已通过固定缓冲区套接字 I/O 获得完整的 SQL 语句?

    您可以定义一个网络协议,其中包括语句大小等信息,或者具有可以读取的“语句结束”标记,而不是仅仅通过行传递原始 SQL 语句。

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

    【讨论】:

    • 最后一个问题:如何从端口获取字节?我很不确定。
    • @Tannenfels 使用 ubyte[] 缓冲区在 Socket 上调用 .receive。我有一个例子here
    【解决方案2】:

    试试这个:

    导入标准异常:假设唯一;

    字符串 s = 假设唯一 (cast(char[])ubyteArray);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      相关资源
      最近更新 更多