diff --git a/problem_00/.dockerignore b/problem_00/.dockerignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/problem_00/.dockerignore @@ -0,0 +1 @@ +/target/ diff --git a/problem_00/.gitignore b/problem_00/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/problem_00/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/problem_00/Cargo.toml b/problem_00/Cargo.toml new file mode 100644 index 0000000..7dbe6ef --- /dev/null +++ b/problem_00/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "problem_00" +version = "0.1.0" +edition = "2021" + +[dependencies] +env_logger = "0.9.0" +log = "0.4.0" +tokio = { version = "1.27.0", features = ["full"] } diff --git a/problem_00/Dockerfile b/problem_00/Dockerfile new file mode 100644 index 0000000..8a9f7ea --- /dev/null +++ b/problem_00/Dockerfile @@ -0,0 +1,11 @@ +FROM rust:latest as builder +RUN apt-get update && apt-get -y install ca-certificates cmake musl-tools libssl-dev && rm -rf /var/lib/apt/lists/* +COPY . . +RUN rustup default stable && rustup update +RUN rustup target add x86_64-unknown-linux-musl +ENV PKG_CONFIG_ALLOW_CROSS=1 +RUN cargo build --target x86_64-unknown-linux-musl --release +FROM scratch +COPY --from=builder /target/x86_64-unknown-linux-musl/release/problem_00 . +EXPOSE 8080 +CMD ["/problem_00"] diff --git a/problem_00/fly.toml b/problem_00/fly.toml new file mode 100644 index 0000000..9823019 --- /dev/null +++ b/problem_00/fly.toml @@ -0,0 +1,20 @@ +# fly.toml app configuration file generated for restless-bush-123 on 2023-04-19T13:36:26+02:00 +# +# See https://fly.io/docs/reference/configuration/ for information about how to use this file. +# + +app = "restless-bush-123" +primary_region = "ams" + +[experimental] + auto_rollback = true + +[env] + ECHO_PORT = "8080" + +[[services]] + protocol = "tcp" + internal_port = 8080 + + [[services.ports]] + port = 8080 diff --git a/problem_00/src/main.rs b/problem_00/src/main.rs new file mode 100644 index 0000000..3d932e3 --- /dev/null +++ b/problem_00/src/main.rs @@ -0,0 +1,38 @@ +use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::net::TcpListener; + +#[tokio::main] +async fn main() -> Result<(), Box> { + env_logger::init(); + let listener = TcpListener::bind("0.0.0.0:8080").await?; + log::info!("Start TCP server"); + loop { + let (mut socket, _) = listener.accept().await?; + + tokio::spawn(async move { + let mut buf = [0; 1024]; + + loop { + let n = match socket.read(&mut buf).await { + Ok(n) if n == 0 => { + log::info!("Receiving echo: {}", n); + return; + } + Ok(n) => { + log::info!("Receiving echo: {}", n); + n + } + Err(e) => { + log::error!("failed to read from socket; err = {:?}", e); + return; + } + }; + + if let Err(e) = socket.write_all(&buf[0..n]).await { + log::error!("failed to write to socket; err = {:?}", e); + return; + } + } + }); + } +}