Skip to content

Instantly share code, notes, and snippets.

@bobrik
Created May 24, 2016 08:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bobrik/bd2c3ce0bdc442c2c0425c2edc6ed427 to your computer and use it in GitHub Desktop.
Save bobrik/bd2c3ce0bdc442c2c0425c2edc6ed427 to your computer and use it in GitHub Desktop.
package main
import (
"errors"
"fmt"
"log"
"net"
"net/http"
)
var ErrNoConnection = errors.New("no connection available")
type singleListener struct {
conn net.Conn
addr net.Addr
}
func newSingleListener(conn net.Conn, addr net.Addr) *singleListener {
return &singleListener{
conn: conn,
addr: addr,
}
}
func (s *singleListener) Accept() (net.Conn, error) {
if s.conn == nil {
return nil, ErrNoConnection
}
conn := s.conn
s.conn = nil
return conn, nil
}
func (s *singleListener) Close() error {
s.conn = nil
return nil
}
func (s *singleListener) Addr() net.Addr {
return s.addr
}
func main() {
listener, err := net.Listen("tcp", "127.0.0.1:1234")
if err != nil {
log.Fatalf("error listening: %s", err)
}
for {
conn, err := listener.Accept()
if err != nil {
log.Fatalf("error accepting: %s", err)
}
log.Printf("accepted connection from %s", conn.RemoteAddr())
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
// connection is available in mux
body := fmt.Sprintf("this is dedicated server for %s", conn.RemoteAddr())
w.Write([]byte(body))
})
server := &http.Server{
Handler: mux,
}
err = server.Serve(newSingleListener(conn, listener.Addr()))
if err != ErrNoConnection {
log.Printf("error serving %s: %s", conn.RemoteAddr(), err)
}
log.Printf("finished serving connection from %s", conn.RemoteAddr())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment