Просмотр исходного кода

ncd: examples: add tcp_echo_server and tcp_echo_client

ambrop7 13 лет назад
Родитель
Сommit
d902d1bf66
2 измененных файлов с 75 добавлено и 0 удалено
  1. 35 0
      ncd/examples/tcp_echo_client.ncd
  2. 40 0
      ncd/examples/tcp_echo_server.ncd

+ 35 - 0
ncd/examples/tcp_echo_client.ncd

@@ -0,0 +1,35 @@
+process main {
+    getargs() args;
+    value(args) args;
+
+    num_different(args.length, "2") bad_args;
+    If (bad_args) {
+        println("bad arguments");
+        exit("1");
+    };
+
+    args->get("0") addr_ip;
+    args->get("1") addr_port;
+
+    sys.connect({"tcp", {"ipv4", addr_ip, addr_port}}) socket;
+    If (socket.is_error) {
+        println("connection error!");
+        exit("1");
+    };
+
+    println("connected");
+
+    socket->write("This echo client is implemented in NCD!\n\n");
+
+    backtrack_point() recv_point;
+
+    socket->read() data;
+    If (data.not_eof) {
+        socket->write(data);
+        recv_point->go();
+    };
+
+    println("server disconnected");
+
+    exit("0");
+}

+ 40 - 0
ncd/examples/tcp_echo_server.ncd

@@ -0,0 +1,40 @@
+process main {
+    getargs() args;
+    value(args) args;
+
+    num_different(args.length, "2") bad_args;
+    If (bad_args) {
+        println("bad arguments");
+        exit("1");
+    };
+
+    args->get("0") addr_ip;
+    args->get("1") addr_port;
+
+    sys.listen({"tcp", {"ipv4", addr_ip, addr_port}}, "client_handler", {}) listener;
+    If (listener.is_error) {
+        println("failed to listen");
+        exit("1");
+    };
+
+    println("listening");
+}
+
+template client_handler {
+    to_string(_socket.client_addr) addr_str;
+
+    println("client ", addr_str, ": connected");
+    rprintln("client ", addr_str, ": disconnected");
+
+    _socket->write("This echo server is implemented in NCD!\n\n");
+
+    backtrack_point() recv_point;
+
+    _socket->read() data;
+    If (data.not_eof) {
+        _socket->write(data);
+        recv_point->go();
+    };
+
+    _socket->close();
+}