Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Go server not hearing remote requests

Tags:

go

I've written a Go server that works perfectly as long as you send it requests from localhost (and addressed to localhost), but it doesn't work when you try to access it from a browser (from a different computer) or even just directed at the external IP address. I want to be able to access it as an external server, not just locally. Why can't it?

The (pared down) source code:

package main

import (
    "fmt"
    "net"
    "os"
)

func main() {
    // Listen for incoming connections.
    l, err := net.Listen("tcp", "localhost:2082")
    if err != nil {
        fmt.Println("Error listening:", err.Error())
        os.Exit(1)
    }
    // Close the listener when the application closes.
    defer l.Close()

    for {
        // Listen for an incoming connection.
        _, err := l.Accept()
        if err != nil {
            fmt.Println("Error accepting: ", err.Error())
            os.Exit(1)
        }
        fmt.Println("Incoming connection")
    }
}

When you curl localhost:2082, it says "Incoming connection".
When you curl mydomain.com:2082, it does nothing.

The port is forwarded. I'm sure of this because I ran a (node.js) web server from that port, and it worked fine. If it's related, I'm running on Ubuntu 12.04 on an Amazon EC2 instance.

I'd appreciate any help. Thanks!

like image 316
River Tam Avatar asked Jul 19 '14 19:07

River Tam


1 Answers

One way to listen to any incoming IP (not just localhost, mapped by default to 127.0.0.1) would be:

net.Listen("tcp", ":2082")

You also have the function net/http/#ListenAndServe, which allows you to trigger listen on multiple specific ip if you want.

go http.ListenAndServe("10.0.0.1:80", nil)
http.ListenAndServe("10.0.0.2:80", nil) 

A good example can be seen in "A Recap of Request Handling in Go".

like image 134
VonC Avatar answered Nov 06 '22 20:11

VonC