51 lines
2.0 KiB
Plaintext
51 lines
2.0 KiB
Plaintext
use module.libnasock;
|
|
use std.os;
|
|
use std.unix;
|
|
|
|
var udp_server = func(hostname, port, retry_delay = 5) {
|
|
var socket = libnasock.socket;
|
|
var server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
|
|
while (socket.bind(server, hostname, port) < 0) {
|
|
println("[", os.time(), "] failed to bind socket "~server~" at ", hostname, ":", port, ".");
|
|
unix.sleep(retry_delay);
|
|
println("[", os.time(), "] retrying...");
|
|
}
|
|
|
|
return {
|
|
sendto: func(ip, port, message) {
|
|
var res = socket.sendto(server, ip, port, message);
|
|
println("[", os.time(), "] send message to ", ip, ":", port, " ", res, " byte(s)");
|
|
return res;
|
|
},
|
|
recvfrom: func(length = 1024) {
|
|
var message = socket.recvfrom(server, length);
|
|
println("[", os.time(), "] get message \"", message.str, "\" from ", message.fromip, ":", message.port);
|
|
return message;
|
|
}
|
|
}
|
|
}
|
|
|
|
var udp_client = func(hostname = "", port = -1, retry_delay = 5) {
|
|
var socket = libnasock.socket;
|
|
var client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
|
|
if (port > 0 and size(hostname) != 0) {
|
|
while (socket.bind(client, hostname, port)<0) {
|
|
println("[",os.time(),"] failed to bind socket "~client~" at ", hostname, ":", port, ".");
|
|
unix.sleep(retry_delay);
|
|
println("[",os.time(),"] retrying...");
|
|
}
|
|
}
|
|
|
|
return {
|
|
sendto: func(ip, port, message) {
|
|
var res = socket.sendto(client, ip, port, message);
|
|
println("[", os.time(), "] send message to ", ip, ":", port, " ", res, " byte(s)");
|
|
return res;
|
|
},
|
|
recvfrom: func(length = 1024) {
|
|
var message = socket.recvfrom(client, length);
|
|
println("[", os.time(), "] get message \"", message.str, "\" from ", message.fromip, ":", message.port);
|
|
return message;
|
|
}
|
|
}
|
|
} |