如何从 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?
用 cast(char[]) st
投射它们。这给字节别名,给你一片完全相同的数据,并且不需要新的分配。您还没有假设字节是有效的 UTF-8,但如果不是,自动解码或程序的其他部分可能会抱怨。如果需要,您可以 运行 std.utf.validate
。
与 std.string.assumeUTF(st)
做基本相同的事情,它至少也断言无效的 UTF 仅在调试版本中。
How do I get a string from char[]?
您可以使用 std.exception.assumeUnique(st)
不安全地为 char[]
添加别名,或者您可以使用 st.idup
或 std.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 用于字符串类型转换,它链接到一个包含更详细的单元测试的文件。
我正在使用这段代码来监听一个端口:
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?
用
cast(char[]) st
投射它们。这给字节别名,给你一片完全相同的数据,并且不需要新的分配。您还没有假设字节是有效的 UTF-8,但如果不是,自动解码或程序的其他部分可能会抱怨。如果需要,您可以 运行std.utf.validate
。与
std.string.assumeUTF(st)
做基本相同的事情,它至少也断言无效的 UTF 仅在调试版本中。
How do I get a string from char[]?
您可以使用 std.exception.assumeUnique(st)
不安全地为 char[]
添加别名,或者您可以使用 st.idup
或 std.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 用于字符串类型转换,它链接到一个包含更详细的单元测试的文件。