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