149 lines
3.7 KiB
Go
149 lines
3.7 KiB
Go
package sam3
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func Test_PrimaryDatagramServerClient(t *testing.T) {
|
|
if testing.Short() {
|
|
return
|
|
}
|
|
|
|
fmt.Println("Test_PrimaryDatagramServerClient")
|
|
earlysam, err := NewSAM(yoursam)
|
|
if err != nil {
|
|
t.Fail()
|
|
return
|
|
}
|
|
defer earlysam.Close()
|
|
keys, err := earlysam.NewKeys()
|
|
if err != nil {
|
|
t.Fail()
|
|
return
|
|
}
|
|
|
|
sam, err := earlysam.NewPrimarySession("PrimaryTunnel", keys, []string{"inbound.length=0", "outbound.length=0", "inbound.lengthVariance=0", "outbound.lengthVariance=0", "inbound.quantity=1", "outbound.quantity=1"})
|
|
if err != nil {
|
|
t.Fail()
|
|
return
|
|
}
|
|
defer sam.Close()
|
|
// fmt.Println("\tServer: My address: " + keys.Addr().Base32())
|
|
fmt.Println("\tServer: Creating tunnel")
|
|
ds, err := sam.NewDatagramSubSession("PrimaryTunnel"+RandString(), 0)
|
|
if err != nil {
|
|
fmt.Println("Server: Failed to create tunnel: " + err.Error())
|
|
t.Fail()
|
|
return
|
|
}
|
|
defer ds.Close()
|
|
c, w := make(chan bool), make(chan bool)
|
|
go func(c, w chan (bool)) {
|
|
sam2, err := NewSAM(yoursam)
|
|
if err != nil {
|
|
c <- false
|
|
return
|
|
}
|
|
defer sam2.Close()
|
|
keys, err := sam2.NewKeys()
|
|
if err != nil {
|
|
c <- false
|
|
return
|
|
}
|
|
fmt.Println("\tClient: Creating tunnel")
|
|
ds2, err := sam2.NewDatagramSession("PRIMARYClientTunnel", keys, []string{"inbound.length=0", "outbound.length=0", "inbound.lengthVariance=0", "outbound.lengthVariance=0", "inbound.quantity=1", "outbound.quantity=1"}, 0)
|
|
if err != nil {
|
|
c <- false
|
|
return
|
|
}
|
|
defer ds2.Close()
|
|
// fmt.Println("\tClient: Servers address: " + ds.LocalAddr().Base32())
|
|
// fmt.Println("\tClient: Clients address: " + ds2.LocalAddr().Base32())
|
|
fmt.Println("\tClient: Tries to send primary to server")
|
|
for {
|
|
select {
|
|
default:
|
|
_, err = ds2.WriteTo([]byte("Hello primary-world! <3 <3 <3 <3 <3 <3"), ds.LocalAddr())
|
|
if err != nil {
|
|
fmt.Println("\tClient: Failed to send primary: " + err.Error())
|
|
c <- false
|
|
return
|
|
}
|
|
time.Sleep(5 * time.Second)
|
|
case <-w:
|
|
fmt.Println("\tClient: Sent primary, quitting.")
|
|
return
|
|
}
|
|
}
|
|
c <- true
|
|
}(c, w)
|
|
buf := make([]byte, 512)
|
|
fmt.Println("\tServer: ReadFrom() waiting...")
|
|
n, _, err := ds.ReadFrom(buf)
|
|
w <- true
|
|
if err != nil {
|
|
fmt.Println("\tServer: Failed to ReadFrom(): " + err.Error())
|
|
t.Fail()
|
|
return
|
|
}
|
|
fmt.Println("\tServer: Received primary: " + string(buf[:n]))
|
|
// fmt.Println("\tServer: Senders address was: " + saddr.Base32())
|
|
}
|
|
|
|
func ExamplePrimaryDatagramSession() {
|
|
// Creates a new PrimarySession, then creates a Datagram subsession on top of it
|
|
|
|
const samBridge = "127.0.0.1:7656"
|
|
|
|
earlysam, err := NewSAM(samBridge)
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return
|
|
}
|
|
defer earlysam.Close()
|
|
keys, err := earlysam.NewKeys()
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return
|
|
}
|
|
myself := keys.Addr()
|
|
|
|
sam, err := earlysam.NewPrimarySession("PrimaryTunnel", keys, []string{"inbound.length=0", "outbound.length=0", "inbound.lengthVariance=0", "outbound.lengthVariance=0", "inbound.quantity=1", "outbound.quantity=1"})
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return
|
|
}
|
|
defer sam.Close()
|
|
|
|
// See the example Option_* variables.
|
|
dg, err := sam.NewDatagramSubSession("DGTUN"+RandString(), 0)
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return
|
|
}
|
|
defer dg.Close()
|
|
someone, err := earlysam.Lookup("zzz.i2p")
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return
|
|
}
|
|
|
|
dg.WriteTo([]byte("Hello stranger!"), someone)
|
|
dg.WriteTo([]byte("Hello myself!"), myself)
|
|
|
|
buf := make([]byte, 31*1024)
|
|
n, _, err := dg.ReadFrom(buf)
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return
|
|
}
|
|
fmt.Println("Got message: '" + string(buf[:n]) + "'")
|
|
fmt.Println("Got message: " + string(buf[:n]))
|
|
|
|
return
|
|
// Output:
|
|
// Got message: Hello myself!
|
|
}
|