【发布时间】:2020-08-19 03:40:35
【问题描述】:
这里我有一个程序想要
-
检测是否是唯一的实例
1.1。它通过尝试创建一个 Unix 域套接字来做到这一点 并尝试将其绑定到特定地址。
-
如果没有运行重复的程序,则建立 UDS 然后监听套接字。
2.1。如果有任何消息通过该套接字,程序将记录传入的消息
2.2。否则它应该一直监听套接字
-
如果有重复的程序,它应该发送一条消息然后退出。
这是我所拥有的:
import std.socket, std.experimental.logger;
immutable string socketAddress = "\0/tmp/com.localserver.myapp";
void main()
{
auto socket = new std.socket.Socket(std.socket.AddressFamily.UNIX,
std.socket.SocketType.STREAM);
auto addr = new std.socket.UnixAddress(socketAddress);
auto isUnique = () {
bool result;
scope (success)
log("returns: ", result);
try
{
socket.bind(addr);
result = true;
}
catch (std.socket.SocketOSException e)
result = false;
// else throw error
return result;
}();
if (isUnique)
{
log("Unique instance detected. Listening...");
// works upto now
char[] buffer = [];
while (1)
{
socket.listen(0);
socket.receive(buffer);
if (buffer != []) {
log("Received message: ", buffer);
}
buffer = [];
}
}
else
{
log("Duplicate instance detected.");
socket.connect(addr);
import std.stdio;
stdout.write("Enter your message:\t");
socket.send(readln());
log("Message has been sent. Exiting.");
}
}
对于那些没有任何套接字编程经验的人来说,该文档似乎不太友好。如何使用 std.socket.Socket 发送和接收消息?
【问题讨论】:
-
我不知道你的代码有什么问题,但我最近写了一个例子,你可能会觉得有用Protocol Buffers and BSD Sockets。插座部分基于 Adam D. Ruppe 的书;)希望对您有所帮助!
标签: d unix-socket