// socket_echo_debug.wren - Debug why echo test fails import "socket" for Socket, SocketInstance foreign class Host { foreign static signalDone() } var mainFiber = Fiber.new { System.print("=== Debug Echo Test ===\n") // Create and setup server System.print("1. Creating server socket...") var serverResult = SocketInstance.new() if (!serverResult || serverResult[0]) { System.print(" ERROR: Failed to create server socket") Host.signalDone() while(true) { Fiber.yield() } } var serverSock = serverResult[1] System.print(" ✓ Server socket created") System.print("\n2. Binding to port 30000...") var bindResult = serverSock.bind("127.0.0.1", 30000) if (bindResult[0]) { System.print(" ERROR: Bind failed: %(bindResult[0])") serverSock.close() Host.signalDone() while(true) { Fiber.yield() } } System.print(" ✓ Bound successfully") System.print("\n3. Starting listen...") var listenResult = serverSock.listen(5) if (listenResult[0]) { System.print(" ERROR: Listen failed: %(listenResult[0])") serverSock.close() Host.signalDone() while(true) { Fiber.yield() } } System.print(" ✓ Listening") var serverDone = false var serverAccepted = false var serverMessages = 0 // Server fiber - with detailed logging var serverFiber = Fiber.new { System.print("\n[SERVER] Starting accept loop...") var acceptAttempts = 0 var maxAttempts = 1000 while (acceptAttempts < maxAttempts && !serverAccepted) { acceptAttempts = acceptAttempts + 1 if (acceptAttempts % 100 == 0) { System.print("[SERVER] Accept attempt %(acceptAttempts)...") } var acceptResult = serverSock.accept() if (acceptResult) { if (acceptResult[0]) { // Only print non-"would block" errors var errStr = acceptResult[0] var isWouldBlock = false if (errStr.count > 5) { // Check for common "would block" messages if (errStr.indexOf("block") >= 0 || errStr.indexOf("Would") >= 0) { isWouldBlock = true } } if (!isWouldBlock) { System.print("[SERVER] Accept error: %(acceptResult[0])") } } else if (acceptResult[1]) { System.print("[SERVER] ✓ Connection accepted! fd=%(acceptResult[1])") serverAccepted = true var clientSock = SocketInstance.fromFd(acceptResult[1]) System.print("[SERVER] Created client socket wrapper") // Echo loop var readAttempts = 0 var maxReads = 500 System.print("[SERVER] Starting read loop...") while (readAttempts < maxReads && serverMessages < 5) { readAttempts = readAttempts + 1 if (readAttempts % 50 == 0) { System.print("[SERVER] Read attempt %(readAttempts)...") } var readResult = clientSock.read(1024) if (readResult) { if (readResult[0]) { var errStr = readResult[0] var isWouldBlock = false if (errStr && errStr.count > 5) { if (errStr.indexOf("block") >= 0 || errStr.indexOf("Would") >= 0) { isWouldBlock = true } } if (!isWouldBlock) { System.print("[SERVER] Read error: %(readResult[0])") } } else if (readResult[1] && readResult[1].count > 0) { serverMessages = serverMessages + 1 System.print("[SERVER] ✓ Received message #%(serverMessages): %(readResult[1].count) bytes") // Echo back var writeErr = clientSock.write(readResult[1]) if (writeErr) { System.print("[SERVER] Write error: %(writeErr)") } else { System.print("[SERVER] ✓ Echoed back %(readResult[1].count) bytes") } } } Fiber.yield() } System.print("[SERVER] Read loop ended after %(readAttempts) attempts") System.print("[SERVER] Messages processed: %(serverMessages)") clientSock.close() System.print("[SERVER] Client socket closed") break } } Fiber.yield() } if (!serverAccepted) { System.print("[SERVER] Never accepted connection after %(acceptAttempts) attempts") } System.print("[SERVER] Done") serverDone = true } var clientDone = false var clientMessages = 0 // Client fiber - with detailed logging var clientFiber = Fiber.new { System.print("\n[CLIENT] Waiting for server to be ready...") for (i in 1..50) { Fiber.yield() } System.print("[CLIENT] Attempting to connect to 127.0.0.1:30000...") var connectResult = SocketInstance.connect("127.0.0.1", 30000) if (!connectResult) { System.print("[CLIENT] ERROR: Connect returned null") clientDone = true return } if (connectResult[0]) { System.print("[CLIENT] ERROR: Connect failed: %(connectResult[0])") clientDone = true return } var clientSock = connectResult[1] System.print("[CLIENT] ✓ Connected successfully") // Send 5 test messages for (i in 1..5) { var message = "Test message #%(i)" System.print("[CLIENT] Sending: %(message)") var writeErr = clientSock.write(message) if (writeErr) { System.print("[CLIENT] Write error: %(writeErr)") break } else { System.print("[CLIENT] ✓ Sent successfully") clientMessages = clientMessages + 1 // Wait for echo var gotEcho = false var echoAttempts = 0 System.print("[CLIENT] Waiting for echo...") while (echoAttempts < 100 && !gotEcho) { echoAttempts = echoAttempts + 1 var readResult = clientSock.read(1024) if (readResult) { if (!readResult[0] && readResult[1] && readResult[1].count > 0) { System.print("[CLIENT] ✓ Received echo: %(readResult[1])") gotEcho = true } } if (echoAttempts % 20 == 0) { System.print("[CLIENT] Still waiting for echo... (attempt %(echoAttempts))") } Fiber.yield() } if (!gotEcho) { System.print("[CLIENT] WARNING: No echo received after %(echoAttempts) attempts") } } // Small delay between messages for (j in 1..10) Fiber.yield() } System.print("[CLIENT] Sent %(clientMessages) messages") clientSock.close() System.print("[CLIENT] Socket closed") System.print("[CLIENT] Done") clientDone = true } // Start both fibers System.print("\n4. Starting server and client fibers...") serverFiber.call() clientFiber.call() // Run event loop with monitoring var iterations = 0 var maxIterations = 2000 var lastPrint = 0 while ((!serverDone || !clientDone) && iterations < maxIterations) { if (!serverDone) serverFiber.call() if (!clientDone) clientFiber.call() iterations = iterations + 1 if (iterations - lastPrint >= 100) { System.print("\n[MAIN] Iteration %(iterations): server=%(serverDone ? "done" : "running"), client=%(clientDone ? "done" : "running")") lastPrint = iterations } Fiber.yield() } System.print("\n=== Test Complete ===") System.print("Total iterations: %(iterations)") System.print("Server accepted: %(serverAccepted)") System.print("Server messages: %(serverMessages)") System.print("Client messages: %(clientMessages)") serverSock.close() Host.signalDone() while(true) { Fiber.yield() } }