98 lines
2.3 KiB
Go

package main
import "io"
import "os"
import "fmt"
import "log"
import "errors"
import "git.tebibyte.media/sashakoshka/hopp"
// import "git.tebibyte.media/sashakoshka/hopp/examples/ping"
var network = "tcp"
var addr = "localhost:7959"
func main() {
name := os.Args[0]
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, "Usage: %s HOST:PORT\n", name)
os.Exit(2)
}
address := os.Args[1]
err := listen(address)
handleErr(1, err)
}
func listen(addr string) error {
defer log.Println("(i) closing")
listener, err := hopp.Listen(network, addr, nil)
if err != nil { return err }
log.Printf("(i) hosting on %s", addr)
for {
conn, err := listener.Accept()
if err != nil { return err }
go run(conn)
}
}
func run(conn hopp.Conn) {
log.Printf("-=E %v connected", conn.RemoteAddr())
defer log.Printf("X=- %v disconnected", conn.RemoteAddr())
defer conn.Close()
for {
trans, err := conn.AcceptTrans()
if err != nil {
if !errors.Is(err, io.EOF) {
log.Printf("XXX %v failed: %v", conn.RemoteAddr(), err)
}
return
}
go runTrans(conn, trans)
}
}
func runTrans(conn hopp.Conn, trans hopp.Trans) {
defer trans.Close()
for {
// message, _, err := ping.Receive(trans)
// if err != nil {
// if !errors.Is(err, io.EOF) {
// log.Printf("XXX failed to receive message: %v", err)
// }
// return
// }
// switch message := message.(type) {
// case *ping.MessagePing:
// log.Printf("--> ping (%d) from %v", message, conn.RemoteAddr())
// response := ping.MessagePong(*message)
// _, err := ping.Send(trans, &response)
// if err != nil {
// log.Printf("XXX failed to send message: %v", err)
// return
// }
// }
method, reader, err := trans.ReceiveReader()
if err != nil { log.Println("SERVER", err); return }
data, err := io.ReadAll(reader)
if err != nil { log.Println("SERVER", err); return }
log.Println("SERVER got", method, data)
log.Println("SERVER send", method, data)
func (){
writer, err := trans.SendWriter(1)
if err != nil { log.Println("SERVER", err); return }
defer writer.Close()
_, err = writer.Write(data[:])
if err != nil { log.Println("SERVER", err); return }
}()
}
}
func handleErr(code int, err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "%s: %v\n", os.Args[0], err)
os.Exit(code)
}
}