// socket_example.wren
import "socket" for Socket, SocketInstance
foreign class Host {
foreign static signalDone()
}
class Time {
static sleep(ms) {
var start = System.clock
while ((System.clock - start) * 1000 < ms) {
Fiber.yield()
}
}
}
var mainFiber = Fiber.new {
System.print("=== Simple Socket Test ===")
// Test 1: Create a server socket
System.print("\n1. Creating server socket...")
var serverResult = SocketInstance.new()
if (!serverResult) {
System.print("Failed to create server socket")
Host.signalDone()
return
}
var serverErr = serverResult[0]
var serverSock = serverResult[1]
if (serverErr) {
System.print("Server socket error: %(serverErr)")
Host.signalDone()
return
}
System.print("Server socket created successfully")
// Test 2: Bind the server socket
System.print("\n2. Binding server socket to port 11000...")
var bindResult = serverSock.bind("127.0.0.1", 11000)
var bindErr = bindResult[0]
var bindSuccess = bindResult[1]
if (bindErr) {
System.print("Bind error: %(bindErr)")
serverSock.close()
Host.signalDone()
return
}
System.print("Server socket bound successfully")
// Test 3: Listen on the server socket
System.print("\n3. Starting to listen...")
var listenResult = serverSock.listen(5)
var listenErr = listenResult[0]
var listenSuccess = listenResult[1]
if (listenErr) {
System.print("Listen error: %(listenErr)")
serverSock.close()
Host.signalDone()
return
}
System.print("Server listening successfully")
// Test 4: Create and connect a client socket
System.print("\n4. Creating client socket and connecting...")
var clientResult = SocketInstance.connect("127.0.0.1", 11000)
if (!clientResult) {
System.print("Failed to create client socket")
serverSock.close()
Host.signalDone()
return
}
var clientErr = clientResult[0]
var clientSock = clientResult[1]
if (clientErr) {
System.print("Client connection error: %(clientErr)")
serverSock.close()
Host.signalDone()
return
}
System.print("Client connected successfully")
// Test 5: Accept connection on server
System.print("\n5. Accepting connection on server...")
var acceptAttempts = 0
var accepted = false
var acceptedSock = null
while (acceptAttempts < 100 && !accepted) {
var acceptResult = serverSock.accept()
var acceptErr = acceptResult[0]
var acceptedFd = acceptResult[1]
if (!acceptErr && acceptedFd) {
acceptedSock = SocketInstance.fromFd(acceptedFd)
accepted = true
System.print("Connection accepted successfully")
} else {
acceptAttempts = acceptAttempts + 1
Fiber.yield()
}
}
if (!accepted) {
System.print("Failed to accept connection after %(acceptAttempts) attempts")
clientSock.close()
serverSock.close()
Host.signalDone()
return
}
// Test 6: Send data from client to server
System.print("\n6. Sending data from client to server...")
var testMessage = "Hello from client!"
var writeErr = clientSock.write(testMessage)
if (writeErr) {
System.print("Client write error: %(writeErr)")
} else {
System.print("Client sent: %(testMessage)")
}
// Test 7: Read data on server side
System.print("\n7. Reading data on server side...")
var readAttempts = 0
var dataReceived = false
while (readAttempts < 100 && !dataReceived) {
var readResult = acceptedSock.read(1024)
var readErr = readResult[0]
var readData = readResult[1]
if (!readErr && readData && readData.count > 0) {
System.print("Server received: %(readData)")
dataReceived = true
// Echo back
var echoErr = acceptedSock.write(readData)
if (echoErr) {
System.print("Server echo error: %(echoErr)")
} else {
System.print("Server echoed data back")
}
} else {
readAttempts = readAttempts + 1
Fiber.yield()
}
}
if (!dataReceived) {
System.print("No data received after %(readAttempts) attempts")
}
// Test 8: Read echo on client side
System.print("\n8. Reading echo on client side...")
readAttempts = 0
var echoReceived = false
while (readAttempts < 100 && !echoReceived) {
var readResult = clientSock.read(1024)
var readErr = readResult[0]
var readData = readResult[1]
if (!readErr && readData && readData.count > 0) {
System.print("Client received echo: %(readData)")
echoReceived = true
} else {
readAttempts = readAttempts + 1
Fiber.yield()
}
}
// Clean up
System.print("\n9. Cleaning up...")
acceptedSock.close()
clientSock.close()
serverSock.close()
System.print("\n=== All tests completed successfully! ===")
Host.signalDone()
}