本文整理匯總了Golang中github.com/NebulousLabs/Sia/modules.NetAddress函數的典型用法代碼示例。如果您正苦於以下問題:Golang NetAddress函數的具體用法?Golang NetAddress怎麽用?Golang NetAddress使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。
在下文中一共展示了NetAddress函數的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: TestAddress
// TestAddress tests that Gateway.Address returns the address of its listener.
// Also tests that the address is not unspecified and is a loopback address.
// The address must be a loopback address for testing.
func TestAddress(t *testing.T) {
if testing.Short() {
t.SkipNow()
}
g := newTestingGateway("TestAddress", t)
defer g.Close()
if g.Address() != g.myAddr {
t.Fatal("Address does not return g.myAddr")
}
if g.Address() != modules.NetAddress(g.listener.Addr().String()) {
t.Fatalf("wrong address: expected %v, got %v", g.listener.Addr(), g.Address())
}
host := modules.NetAddress(g.listener.Addr().String()).Host()
ip := net.ParseIP(host)
if ip == nil {
t.Fatal("address is not an IP address")
}
if ip.IsUnspecified() {
t.Fatal("expected a non-unspecified address")
}
if !ip.IsLoopback() {
t.Fatal("expected a loopback address")
}
}
示例2: TestAddress
func TestAddress(t *testing.T) {
g := newTestingGateway("TestAddress", t)
defer g.Close()
if g.Address() != g.myAddr {
t.Fatal("Address does not return g.myAddr")
}
port := modules.NetAddress(g.listener.Addr().String()).Port()
expAddr := modules.NetAddress(net.JoinHostPort("::1", port))
if g.Address() != expAddr {
t.Fatalf("Wrong address: expected %v, got %v", expAddr, g.Address())
}
}
示例3: learnHostname
// learnHostname discovers the external IP of the Host. The Host cannot
// announce until the external IP is known.
func (h *Host) learnHostname() {
if build.Release == "testing" {
return
}
var host string
// try UPnP first, then fallback to myexternalip.com
d, err := upnp.Discover()
if err == nil {
host, err = d.ExternalIP()
}
if err != nil {
host, err = myExternalIP()
}
if err != nil {
h.log.Println("WARN: failed to discover external IP")
return
}
h.mu.Lock()
h.myAddr = modules.NetAddress(net.JoinHostPort(host, h.myAddr.Port()))
h.HostSettings.IPAddress = h.myAddr
h.save()
h.mu.Unlock()
}
示例4: threadedAcceptConn
// threadedAcceptConn adds a connecting node as a peer.
func (g *Gateway) threadedAcceptConn(conn net.Conn) {
if g.threads.Add() != nil {
return
}
defer g.threads.Done()
addr := modules.NetAddress(conn.RemoteAddr().String())
g.log.Debugf("INFO: %v wants to connect", addr)
remoteVersion, err := acceptConnVersionHandshake(conn, build.Version)
if err != nil {
g.log.Debugf("INFO: %v wanted to connect but version handshake failed: %v", addr, err)
conn.Close()
return
}
if build.VersionCmp(remoteVersion, "1.0.0") < 0 {
err = g.managedAcceptConnOldPeer(conn, remoteVersion)
} else {
err = g.managedAcceptConnNewPeer(conn, remoteVersion)
}
if err != nil {
g.log.Debugf("INFO: %v wanted to connect, but failed: %v", addr, err)
conn.Close()
return
}
g.log.Debugf("INFO: accepted connection from new peer %v (v%v)", addr, remoteVersion)
}
示例5: managedLearnHostname
// managedLearnHostname discovers the external IP of the Host. If the host's
// net address is blank and the host's auto address appears to have changed,
// the host will make an announcement on the blockchain.
func (h *Host) managedLearnHostname() {
if build.Release == "testing" {
return
}
h.mu.RLock()
netAddr := h.settings.NetAddress
h.mu.RUnlock()
// If the settings indicate that an address has been manually set, there is
// no reason to learn the hostname.
if netAddr != "" {
return
}
// try UPnP first, then fallback to myexternalip.com
var hostname string
d, err := upnp.Discover()
if err == nil {
hostname, err = d.ExternalIP()
}
if err != nil {
hostname, err = myExternalIP()
}
if err != nil {
h.log.Println("WARN: failed to discover external IP")
return
}
h.mu.Lock()
defer h.mu.Unlock()
autoAddress := modules.NetAddress(net.JoinHostPort(hostname, h.port))
if err := autoAddress.IsValid(); err != nil {
h.log.Printf("WARN: discovered hostname %q is invalid: %v", autoAddress, err)
return
}
if autoAddress == h.autoAddress && h.announced {
// Nothing to do - the auto address has not changed and the previous
// annoucement was successful.
return
}
h.autoAddress = autoAddress
err = h.save()
if err != nil {
h.log.Println(err)
}
// Announce the host, but only if the host is either accepting contracts or
// has a storage obligation. If the host is not accepting contracts and has
// no open contracts, there is no reason to notify anyone that the host's
// address has changed.
if h.settings.AcceptingContracts || h.financialMetrics.ContractCount > 0 {
err = h.announce(autoAddress)
if err != nil {
// Set h.announced to false, as the address has changed yet the
// renewed annoucement has failed.
h.announced = false
h.log.Debugln("unable to announce address after upnp-detected address change:", err)
}
}
}
示例6: learnHostname
// learnHostname discovers the external IP of the Gateway. Once the IP has
// been discovered, it registers the ShareNodes RPC to be called on new
// connections, advertising the IP to other nodes.
func (g *Gateway) learnHostname() {
if build.Release == "testing" {
return
}
var host string
// try UPnP first, then fallback to myexternalip.com
d, err := upnp.Discover()
if err == nil {
host, err = d.ExternalIP()
}
if err != nil {
host, err = myExternalIP()
}
if err != nil {
g.log.Println("WARN: failed to discover external IP")
return
}
id := g.mu.Lock()
g.myAddr = modules.NetAddress(net.JoinHostPort(host, g.myAddr.Port()))
g.mu.Unlock(id)
g.log.Println("INFO: our address is", g.myAddr)
// now that we know our address, we can start advertising it
g.RegisterConnectCall("RelayNode", g.sendAddress)
}
示例7: threadedAcceptConn
// threadedAcceptConn adds a connecting node as a peer.
func (g *Gateway) threadedAcceptConn(conn net.Conn) {
if g.threads.Add() != nil {
conn.Close()
return
}
defer g.threads.Done()
conn.SetDeadline(time.Now().Add(connStdDeadline))
addr := modules.NetAddress(conn.RemoteAddr().String())
g.log.Debugf("INFO: %v wants to connect", addr)
remoteVersion, err := acceptConnVersionHandshake(conn, build.Version)
if err != nil {
g.log.Debugf("INFO: %v wanted to connect but version handshake failed: %v", addr, err)
conn.Close()
return
}
if build.VersionCmp(remoteVersion, handshakeUpgradeVersion) < 0 {
err = g.managedAcceptConnOldPeer(conn, remoteVersion)
} else {
err = g.managedAcceptConnNewPeer(conn, remoteVersion)
}
if err != nil {
g.log.Debugf("INFO: %v wanted to connect, but failed: %v", addr, err)
conn.Close()
return
}
// Handshake successful, remove the deadline.
conn.SetDeadline(time.Time{})
g.log.Debugf("INFO: accepted connection from new peer %v (v%v)", addr, remoteVersion)
}
示例8: initNetworking
// initNetworking performs actions like port forwarding, and gets the host
// established on the network.
func (h *Host) initNetworking(address string) error {
// Create listener and set address.
var err error
h.listener, err = net.Listen("tcp", address)
if err != nil {
return err
}
h.netAddress = modules.NetAddress(h.listener.Addr().String())
// Non-blocking, perform port forwarding and hostname discovery.
go func() {
h.resourceLock.RLock()
defer h.resourceLock.RUnlock()
if h.closed {
return
}
h.mu.RLock()
port := h.netAddress.Port()
h.mu.RUnlock()
err := h.forwardPort(port)
if err != nil {
h.log.Println("ERROR: failed to forward port:", err)
}
h.learnHostname()
}()
// Launch the listener.
go h.threadedListen()
return nil
}
示例9: New
// New returns an initialized Gateway.
func New(addr string, persistDir string) (g *Gateway, err error) {
// Create the directory if it doesn't exist.
err = os.MkdirAll(persistDir, 0700)
if err != nil {
return
}
// Create the logger.
logger, err := makeLogger(persistDir)
if err != nil {
return
}
g = &Gateway{
handlers: make(map[rpcID]modules.RPCFunc),
initRPCs: make(map[string]modules.RPCFunc),
peers: make(map[modules.NetAddress]*peer),
nodes: make(map[modules.NetAddress]struct{}),
persistDir: persistDir,
mu: sync.New(modules.SafeMutexDelay, 2),
log: logger,
}
// Load the old peer list. If it doesn't exist, no problem, but if it does,
// we want to know about any errors preventing us from loading it.
if loadErr := g.load(); loadErr != nil && !os.IsNotExist(loadErr) {
return nil, loadErr
}
// Create listener and set address.
g.listener, err = net.Listen("tcp", addr)
if err != nil {
return
}
_, port, _ := net.SplitHostPort(g.listener.Addr().String())
g.myAddr = modules.NetAddress(net.JoinHostPort("::1", port))
// Register RPCs.
g.RegisterRPC("ShareNodes", g.shareNodes)
g.RegisterRPC("RelayNode", g.relayNode)
g.RegisterConnectCall("ShareNodes", g.requestNodes)
g.log.Println("INFO: gateway created, started logging")
// Learn our external IP.
go g.learnHostname()
// Automatically forward the RPC port, if possible.
go g.forwardPort(port)
// Spawn the peer and node managers. These will attempt to keep the peer
// and node lists healthy.
go g.threadedPeerManager()
go g.threadedNodeManager()
// Spawn the primary listener.
go g.listen()
return
}
示例10: acceptConn
// acceptConn adds a connecting node as a peer.
func (g *Gateway) acceptConn(conn net.Conn) {
addr := modules.NetAddress(conn.RemoteAddr().String())
g.log.Printf("INFO: %v wants to connect", addr)
// read version
var remoteVersion string
if err := encoding.ReadObject(conn, &remoteVersion, maxAddrLength); err != nil {
conn.Close()
g.log.Printf("INFO: %v wanted to connect, but we could not read their version: %v", addr, err)
return
}
// check that version is acceptable
// NOTE: this version must be bumped whenever the gateway or consensus
// breaks compatibility.
if build.VersionCmp(remoteVersion, "0.3.3") < 0 {
encoding.WriteObject(conn, "reject")
conn.Close()
g.log.Printf("INFO: %v wanted to connect, but their version (%v) was unacceptable", addr, remoteVersion)
return
}
// respond with our version
if err := encoding.WriteObject(conn, build.Version); err != nil {
conn.Close()
g.log.Printf("INFO: could not write version ack to %v: %v", addr, err)
return
}
// If we are already fully connected, kick out an old peer to make room
// for the new one. Importantly, prioritize kicking a peer with the same
// IP as the connecting peer. This protects against Sybil attacks.
id := g.mu.Lock()
if len(g.peers) >= fullyConnectedThreshold {
// first choose a random peer, preferably inbound. If have only
// outbound peers, we'll wind up kicking an outbound peer; but
// subsequent inbound connections will kick each other instead of
// continuing to replace outbound peers.
kick, err := g.randomInboundPeer()
if err != nil {
kick, _ = g.randomPeer()
}
// if another peer shares this IP, choose that one instead
for p := range g.peers {
if p.Host() == addr.Host() {
kick = p
break
}
}
g.peers[kick].sess.Close()
delete(g.peers, kick)
g.log.Printf("INFO: disconnected from %v to make room for %v", kick, addr)
}
// add the peer
g.addPeer(&peer{addr: addr, sess: muxado.Server(conn), inbound: true})
g.mu.Unlock(id)
g.log.Printf("INFO: accepted connection from new peer %v (v%v)", addr, remoteVersion)
}
示例11: TestShareNodes
func TestShareNodes(t *testing.T) {
g1 := newTestingGateway("TestShareNodes1", t)
defer g1.Close()
g2 := newTestingGateway("TestShareNodes2", t)
defer g2.Close()
// add a node to g2
id := g2.mu.Lock()
g2.addNode(dummyNode)
g2.mu.Unlock(id)
// connect
err := g1.Connect(g2.Address())
if err != nil {
t.Fatal("couldn't connect:", err)
}
// g1 should have received the node
time.Sleep(100 * time.Millisecond)
id = g1.mu.Lock()
if g1.addNode(dummyNode) == nil {
t.Fatal("gateway did not receive nodes during Connect:", g1.nodes)
}
g1.mu.Unlock(id)
// remove all nodes from both peers
id = g1.mu.Lock()
g1.nodes = map[modules.NetAddress]struct{}{}
g1.mu.Unlock(id)
id = g2.mu.Lock()
g2.nodes = map[modules.NetAddress]struct{}{}
g2.mu.Unlock(id)
// SharePeers should now return no peers
var nodes []modules.NetAddress
err = g1.RPC(g2.Address(), "ShareNodes", func(conn modules.PeerConn) error {
return encoding.ReadObject(conn, &nodes, maxSharedNodes*maxAddrLength)
})
if err != nil {
t.Fatal(err)
}
if len(nodes) != 0 {
t.Fatal("gateway gave non-existent addresses:", nodes)
}
// sharing should be capped at maxSharedNodes
for i := 0; i < maxSharedNodes+10; i++ {
g2.addNode(modules.NetAddress("111.111.111.111:" + strconv.Itoa(i)))
}
err = g1.RPC(g2.Address(), "ShareNodes", func(conn modules.PeerConn) error {
return encoding.ReadObject(conn, &nodes, maxSharedNodes*maxAddrLength)
})
if err != nil {
t.Fatal(err)
}
if len(nodes) != maxSharedNodes {
t.Fatalf("gateway gave wrong number of nodes: expected %v, got %v", maxSharedNodes, len(nodes))
}
}
示例12: New
// New returns an initialized Gateway.
func New(addr string, persistDir string) (g *Gateway, err error) {
// Create the directory if it doesn't exist.
err = os.MkdirAll(persistDir, 0700)
if err != nil {
return
}
// Create the logger.
logger, err := makeLogger(persistDir)
if err != nil {
return
}
g = &Gateway{
handlers: make(map[rpcID]modules.RPCFunc),
initRPCs: make(map[string]modules.RPCFunc),
peers: make(map[modules.NetAddress]*peer),
nodes: make(map[modules.NetAddress]struct{}),
persistDir: persistDir,
mu: sync.New(modules.SafeMutexDelay, 2),
log: logger,
}
// Register RPCs.
g.RegisterRPC("ShareNodes", g.shareNodes)
g.RegisterRPC("RelayNode", g.relayNode)
g.RegisterConnectCall("ShareNodes", g.requestNodes)
g.RegisterConnectCall("RelayNode", g.sendAddress)
g.log.Println("INFO: gateway created, started logging")
// Create listener and set address.
g.listener, err = net.Listen("tcp", addr)
if err != nil {
return
}
_, port, _ := net.SplitHostPort(g.listener.Addr().String())
g.myAddr = modules.NetAddress(net.JoinHostPort(modules.ExternalIP, port))
g.log.Println("INFO: our address is", g.myAddr)
// Spawn the primary listener.
go g.listen()
// Load the old peer list. If it doesn't exist, no problem, but if it does,
// we want to know about any errors preventing us from loading it.
if loadErr := g.load(); loadErr != nil && !os.IsNotExist(loadErr) {
return nil, loadErr
}
// Spawn the connector loop. This will continually attempt to add nodes as
// peers to ensure we stay well-connected.
go g.makeOutboundConnections()
return
}
示例13: gatewayRemoveHandler
// gatewayRemoveHandler handles the API call to remove a peer from the gateway.
func (srv *Server) gatewayRemoveHandler(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
addr := modules.NetAddress(ps.ByName("netaddress"))
err := srv.gateway.Disconnect(addr)
if err != nil {
writeError(w, err.Error(), http.StatusBadRequest)
return
}
writeSuccess(w)
}
示例14: gatewayPeersRemoveHandler
// gatewayPeersRemoveHandler handles the API call to remove a peer from the gateway.
func (srv *Server) gatewayPeersRemoveHandler(w http.ResponseWriter, req *http.Request) {
addr := modules.NetAddress(req.FormValue("address"))
err := srv.gateway.Disconnect(addr)
if err != nil {
writeError(w, err.Error(), http.StatusBadRequest)
return
}
writeSuccess(w)
}
示例15: gatewayDisconnectHandler
// gatewayDisconnectHandler handles the API call to remove a peer from the gateway.
func (api *API) gatewayDisconnectHandler(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
addr := modules.NetAddress(ps.ByName("netaddress"))
err := api.gateway.Disconnect(addr)
if err != nil {
WriteError(w, Error{err.Error()}, http.StatusBadRequest)
return
}
WriteSuccess(w)
}