aboutsummaryrefslogtreecommitdiff
path: root/test_msgnet
diff options
context:
space:
mode:
Diffstat (limited to 'test_msgnet')
-rw-r--r--test_msgnet/main.go145
-rw-r--r--test_msgnet/main_.go7
2 files changed, 152 insertions, 0 deletions
diff --git a/test_msgnet/main.go b/test_msgnet/main.go
new file mode 100644
index 0000000..b9a5048
--- /dev/null
+++ b/test_msgnet/main.go
@@ -0,0 +1,145 @@
+package main
+
+// void onTerm_cgo(int sig);
+import "C"
+
+import (
+ "unsafe"
+ "encoding/binary"
+ "fmt"
+ "salticidae-go"
+)
+
+var ec salticidae.EventContext
+const (
+ MSG_OPCODE_HELLO salticidae.Opcode = iota
+ MSG_OPCODE_ACK
+)
+
+//export onTerm
+func onTerm(_ int) {
+ ec.Stop()
+}
+
+type MsgHello struct {
+ name string
+ text string
+}
+
+func msgHelloSerialize(name string, text string) salticidae.Msg {
+ serialized := salticidae.NewDataStream()
+ t := make([]byte, 4)
+ binary.LittleEndian.PutUint32(t, uint32(len(name)))
+ serialized.PutData(t)
+ serialized.PutData([]byte(name))
+ serialized.PutData([]byte(text))
+ return salticidae.NewMsg(MSG_OPCODE_HELLO, serialized.ToByteArray())
+}
+
+func msgHelloUnserialize(msg salticidae.Msg) MsgHello {
+ p := msg.GetPayload()
+ length := binary.LittleEndian.Uint32(p.GetData(4))
+ name := string(p.GetData(int(length)))
+ text := string(p.GetData(p.Size()))
+ p.Free()
+ return MsgHello { name: name, text: text }
+}
+
+func msgAckSerialize() salticidae.Msg {
+ return salticidae.NewMsg(MSG_OPCODE_ACK, salticidae.NewByteArray())
+}
+
+type MyNet struct {
+ net salticidae.MsgNetwork
+ name string
+}
+
+var alice, bob MyNet
+
+func onReceiveHello(_msg salticidae.Msg, conn salticidae.MsgNetworkConn) {
+ net := conn.GetNet()
+ name := bob.name
+ if net == alice.net.GetInner() {
+ name = alice.name
+ }
+ msg := msgHelloUnserialize(_msg)
+ fmt.Printf("[%s] %s says %s\n", name, msg.name, msg.text)
+ ack := msgAckSerialize()
+ net.SendMsg(ack, conn)
+ ack.Free()
+}
+
+func onReceiveAck(msg salticidae.Msg, conn salticidae.MsgNetworkConn) {
+ net := conn.GetNet()
+ name := bob.name
+ if net == alice.net.GetInner() {
+ name = alice.name
+ }
+ fmt.Printf("[%s] the peer knows\n", name)
+}
+
+func connHandler(conn salticidae.MsgNetworkConn, connected bool) {
+ net := conn.GetNet()
+ n := &bob
+ if net == alice.net.GetInner() {
+ n = &alice
+ }
+ name := n.name
+ if connected {
+ if conn.GetMode() == salticidae.CONN_MODE_ACTIVE {
+ fmt.Printf("[%s] Connected, sending hello.", name)
+ hello := msgHelloSerialize(name, "Hello there!")
+ n.net.SendMsg(hello, conn)
+ hello.Free()
+ } else {
+ fmt.Printf("[%s] Accepted, waiting for greetings.\n", name)
+ }
+ } else {
+ fmt.Printf("[%s] Disconnected, retrying.\n", name)
+ net.Connect(conn.GetAddr())
+ }
+}
+
+func genMyNet(ec salticidae.EventContext, name string) MyNet {
+ netconfig := salticidae.NewMsgNetworkConfig()
+ n := MyNet {
+ net: salticidae.NewMsgNetwork(ec, netconfig),
+ name: name,
+ }
+ netconfig.Free()
+ return n
+}
+
+func main() {
+ ec = salticidae.NewEventContext()
+ alice_addr := salticidae.NewAddrFromIPPortString("127.0.0.1:12345")
+ bob_addr := salticidae.NewAddrFromIPPortString("127.0.0.1:12346")
+
+ alice := genMyNet(ec, "Alice")
+ bob := genMyNet(ec, "Bob")
+
+ alice.net.Start()
+ bob.net.Start()
+
+ alice.net.Listen(alice_addr)
+ bob.net.Listen(bob_addr)
+
+ alice.net.Connect(bob_addr)
+ bob.net.Connect(alice_addr)
+
+ alice_addr.Free()
+ bob_addr.Free()
+
+ ev_int := salticidae.NewSigEvent(ec, salticidae.SigEventCallback(unsafe.Pointer(C.onTerm_cgo)))
+ ev_int.Add(salticidae.SIGINT)
+ ev_term := salticidae.NewSigEvent(ec, salticidae.SigEventCallback(unsafe.Pointer(C.onTerm_cgo)))
+ ev_term.Add(salticidae.SIGTERM)
+
+ ec.Dispatch()
+
+ ev_int.Free()
+ ev_term.Free()
+ alice.net.Free()
+ bob.net.Free()
+ ec.Free()
+}
diff --git a/test_msgnet/main_.go b/test_msgnet/main_.go
new file mode 100644
index 0000000..2f53d93
--- /dev/null
+++ b/test_msgnet/main_.go
@@ -0,0 +1,7 @@
+package main
+
+// void onTerm_cgo(int sig) {
+// void onTerm(int);
+// onTerm(sig);
+// }
+import "C"