howiieyu / peerguard

P2P network library in Go. Committed to direct communication between devices 🌍

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Example

1. Code

Peer1 (act as echo server)

peermap := p2p.Peermap("wss://synf.in/pg")

intent, err := network.JoinOIDC(oidc.ProviderGoogle, peermap)
if err != nil {
    panic(err)
}
fmt.Println(intent.AuthURL()) // https://synf.in/oidc/google?state=5G68CtYnMRMdrtrRF
secret, err := intent.Wait(context.TODO())
if err != nil {
    panic(err)
}

packetConn, err := p2p.ListenPacket(
    secret.Secret, peermap, 
    p2p.ListenPeerID("uniqueString"), // any unique string (less than 256bytes)
)
if err != nil {
    panic(err)
}

// unreliability echo server
buf := make([]byte, 1024) 
for {
    n, peerID, err := packetConn.ReadFrom(buf)
    if err != nil {
        panic(err)
    }
    fmt.Println("Echo packet to", peerID, string(buf[:n]))
    _, err = packetConn.WriteTo(peerID, buf[:n])
    if err != nil {
        panic(err)
    }
}

Peer2

...

packetConn, err := p2p.ListenPacket(secret.Secret, peermap)
if err != nil {
    panic(err)
}

defer packetConn.Close()

// "uniqueString" is above echo server's address
_, err := packetConn.WriteTo(peer.PeerID("uniqueString"), []byte("hello"))
if err != nil {
    panic(err)
}

packetConn.SetReadDeadline(time.Now().Add(time.Second))

buf := make([]byte, 1024)
n, peerID, err := packetConn.ReadFrom(buf)
if err !=nil {
    panic(err)
}
fmt.Println(peerID, ":", string(buf[:n])) // uniqueString : hello

2. VPN(p2p)

Machine 1

# peerguard vpn --peermap wss://synf.in/pg --ipv4 100.64.0.1/24 --ipv6 fd00::1/64

Machine 2

# peerguard vpn --peermap wss://synf.in/pg --ipv4 100.64.0.2/24 --ipv6 fd00::2/64

Another terminal on machine 2

# ping 100.64.0.1
PING 100.64.0.1 (100.64.0.1) 56(84) bytes of data.
64 bytes from 100.64.0.1: icmp_seq=1 ttl=64 time=7.88 ms
64 bytes from 100.64.0.1: icmp_seq=2 ttl=64 time=4.19 ms
64 bytes from 100.64.0.1: icmp_seq=3 ttl=64 time=4.47 ms
64 bytes from 100.64.0.1: icmp_seq=4 ttl=64 time=4.54 ms
...
# ping fd00::1
PING fd00::1 (fd00::1) 56 data bytes
64 bytes from fd00::1: icmp_seq=1 ttl=64 time=4.29 ms
64 bytes from fd00::1: icmp_seq=2 ttl=64 time=5.84 ms
64 bytes from fd00::1: icmp_seq=3 ttl=64 time=3.48 ms
64 bytes from fd00::1: icmp_seq=4 ttl=64 time=4.69 ms

About

P2P network library in Go. Committed to direct communication between devices 🌍

License:GNU General Public License v3.0


Languages

Language:Go 98.2%Language:Makefile 1.8%