diff --git a/examples/tcp_server.zr b/examples/tcp_server.zr index 94e5bf9..35a55ff 100644 --- a/examples/tcp_server.zr +++ b/examples/tcp_server.zr @@ -3,11 +3,17 @@ func main[] : i64 io.println("Listening on port 8000...") let resp = mem.alloc(60000) + let addr = mem.alloc(16) while true - let conn = net.accept(s) + let conn = net.accept(s, addr) if conn < 0 continue + io.printf("%d.%d.%d.%d:%d\n", addr[4], addr[5], addr[6], addr[7], mem.read16be(addr + 2)) + + io.print_sized(resp, n) + io.println("") + let n = net.read(conn, resp, 60000) net.send(conn, resp, n) net.close(conn) diff --git a/examples/udp_server.zr b/examples/udp_server.zr index ddd8ba0..b8089ed 100644 --- a/examples/udp_server.zr +++ b/examples/udp_server.zr @@ -8,5 +8,10 @@ func main[] : i64 net.UDPPacket.free(pkt) continue + io.printf("%d.%d.%d.%d:%d\n", pkt->source_addr[4], pkt->source_addr[5], pkt->source_addr[6], pkt->source_addr[7], mem.read16be(pkt->source_addr + 2)) + + io.print_sized(pkt->data, pkt->size) + io.println("") + net.udp_send_to(s, pkt->source_addr, pkt->data, pkt->size) net.UDPPacket.free(pkt) diff --git a/src/std/net.zr b/src/std/net.zr index e90625c..2f60493 100644 --- a/src/std/net.zr +++ b/src/std/net.zr @@ -69,8 +69,9 @@ func net.connect?[packed_host: i64, port: i64] : i64 mem.free(sa) return s -func net.accept[s: i64] : i64 - return _builtin_syscall(SYS_accept, s, 0, 0) +func net.accept[s: i64, addr: ptr] : i64 + let addrlen = 16 + return _builtin_syscall(SYS_accept, s, addr, ^addrlen) func net.send[s: i64, data: ptr, size: i64] : void _builtin_syscall(SYS_sendto, s, data, size, 0, 0, 0) @@ -88,11 +89,6 @@ struct net.UDPSocket fd: i64 addr: ptr -struct net.UDPPacket - data: ptr - source_addr: ptr - size: i64 - func net.create_udp_client?[packed_host: i64, port: i64] : net.UDPSocket err.clear() let s = new* net.UDPSocket @@ -131,6 +127,16 @@ func net.create_udp_server?[packed_host: i64, port: i64] : net.UDPSocket func net.udp_send_to[s: net.UDPSocket, addr: ptr, data: ptr, size: i64] : void _builtin_syscall(SYS_sendto, s->fd, data, size, 0, addr, 16) +struct net.UDPPacket + data: ptr + source_addr: ptr + size: i64 + +func net.UDPPacket.free[pkt: net.UDPPacket] : void + mem.free(pkt->data) + mem.free(pkt->source_addr) + mem.free(pkt) + func net.udp_receive[s: net.UDPSocket, size: i64] : net.UDPPacket let pkt = new* net.UDPPacket pkt->data = mem.alloc(size) @@ -146,11 +152,6 @@ func net.UDPSocket.close_and_free[s: net.UDPSocket] : void mem.free(s->addr) mem.free(s) -func net.UDPPacket.free[pkt: net.UDPPacket] : void - mem.free(pkt->data) - mem.free(pkt->source_addr) - mem.free(pkt) - const DNS_TYPE_A = 1 const DNS_CLASS_IN = 1 const DNS_RECURSION_DESIRED = 256 @@ -195,7 +196,7 @@ func net.build_dns_query[domain_name: str, record_type: i64] : io.Buffer io.Buffer.free(name) return out -// TODO: dont resolve IPs +// TODO: dont resolve if its already an IP func net.resolve?[domain: str] : i64 err.clear() let query = net.build_dns_query(domain, DNS_TYPE_A)