From a8ce309eacf412974101e98322207c66479004d0 Mon Sep 17 00:00:00 2001 From: Toni Date: Mon, 30 Jun 2025 11:20:09 +0200 Subject: [PATCH] tcp client --- examples/tcp_client.zr | 20 ++++++++++++++++++++ src/codegen_x86_64.rs | 28 ++++++++++++++++++++++++++++ src/std.zr | 4 ++-- 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 examples/tcp_client.zr diff --git a/examples/tcp_client.zr b/examples/tcp_client.zr new file mode 100644 index 0000000..3a33c8b --- /dev/null +++ b/examples/tcp_client.zr @@ -0,0 +1,20 @@ +func main[] : I64 + let s: I64 = socket(2, 1, 0) + if s < 0 + panic("socket() failed") + + let sa: Ptr = _builtin_sa_from_addr("23.192.228.80", 80) + if connect(s, sa, 16) < 0 + panic("connect() failed") + free(sa) + + let req: String = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" + send(s, req, strlen(req), 0) + + let resp: String = malloc(60000) + let n: I64 = read(s, resp, 60000) + String.set(resp, n, 0) + print(resp) + free(resp) + + close(s) \ No newline at end of file diff --git a/src/codegen_x86_64.rs b/src/codegen_x86_64.rs index 704daee..88bd50b 100644 --- a/src/codegen_x86_64.rs +++ b/src/codegen_x86_64.rs @@ -124,6 +124,12 @@ extern readdir extern closedir extern exit extern gettimeofday +extern connect +extern inet_addr +extern socket +extern send +extern read +extern close section .text._builtin_deref _builtin_deref: @@ -245,6 +251,28 @@ _builtin_array_free: mov rdi, rbx pop rbx jmp free + +_builtin_sa_from_addr: + push r15 + push r14 + push rbx + mov rbx, rsi + mov r14, rdi + push 16 + pop rdi + call malloc + mov r15, rax + mov dword [rax], 2 + rol bx, 8 + mov word [rax+2], bx + mov rdi, r14 + call inet_addr + mov dword [r15+4], eax + mov rax, r15 + pop rbx + pop r14 + pop r15 + ret " ); Ok(()) diff --git a/src/std.zr b/src/std.zr index df3db50..0b3c273 100644 --- a/src/std.zr +++ b/src/std.zr @@ -11,8 +11,8 @@ func print_i64[x: I64] : I64 func String.nth[s: String, n: I64] : U8 return _builtin_deref(s + n) -func String.set[s: String, n: I64] : I64 - _builtin_string_set(s, n) +func String.set[s: String, n: I64, c: U8] : I64 + _builtin_string_set(s, n, c) func String.is_whitespace[c: U8] : Bool return c == ' ' || c == 10 || c == 13 || c == 9