|
// 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() }
|
|
}
|