Ben Kosten
09/12/2022, 3:11 PMByteReadChannel
and copying those bytes over and Writing to another ByteWriteChannel
The proxy should tunnel connections from client A to server B via proxy server C like so:
A <---> C <---> B
currently, I have something like the following:
//some boilerplate to open correct channels and establish socket connections
val clientReadChannel = clientSocket.openReadChannel()
val clientWriteChannel = clientSocket.openWriteChannel(true)
val serverReadChannel = serverSocket.openReadChannel()
val serverWriteChannel = serverSocket.openWriteChannel(true)
launch(<http://Dispatchers.IO|Dispatchers.IO>) {
clientReadChannel.copyTo(serverWriteChannel)
}
launch(<http://Dispatchers.IO|Dispatchers.IO>) {
serverReadChannel.copyTo(clientWriteChannel)
}
Ben Kosten
09/12/2022, 4:56 PMBen Kosten
09/12/2022, 4:56 PMBen Kosten
09/12/2022, 4:57 PMval clientReadChannel = clientSocket.openReadChannel()
val clientWriteChannel = clientSocket.openWriteChannel(true)
val serverReadChannel = serverSocket.openReadChannel()
val serverWriteChannel = serverSocket.openWriteChannel(true)
launch(<http://Dispatchers.IO|Dispatchers.IO>) {
clientReadChannel.read {
launch(<http://Dispatchers.IO|Dispatchers.IO>) { serverWriteChannel.writeAvailable(it) }
}
}
launch(<http://Dispatchers.IO|Dispatchers.IO>) {
serverReadChannel.read {
launch(<http://Dispatchers.IO|Dispatchers.IO>) { clientWriteChannel.writeAvailable(it) }
}
}
But it only reads once and writes once then stops and when I put the clientReadChannel
or the serverReadChannel
in a while loop I get some wildly bizarre behaviour where the same packet gets read multiple timesBen Kosten
09/12/2022, 4:57 PMAleksei Tirman [JB]
09/12/2022, 6:14 PMlaunch(<http://Dispatchers.IO|Dispatchers.IO>) {
val buffer = ByteBuffer.allocateDirect(32 * 1024)
while (serverReadChannel.readAvailable(buffer) > 0) {
buffer.flip()
// Modify buffer here
clientWriteChannel.writeFully(buffer)
buffer.clear()
}
}
Ben Kosten
09/12/2022, 6:33 PMBen Kosten
09/12/2022, 6:33 PM