Skip to content

Instantly share code, notes, and snippets.

@klizhentas
Created August 26, 2014 18:17
Show Gist options
  • Save klizhentas/40b45f03079485b55635 to your computer and use it in GitHub Desktop.
Save klizhentas/40b45f03079485b55635 to your computer and use it in GitHub Desktop.
RST case
package main
import (
"bufio"
"fmt"
// "io/ioutil"
"log"
"net"
"os"
"reflect"
)
func GetFD(l net.Listener) (uintptr, string) {
v := reflect.ValueOf(l).Elem().FieldByName("fd").Elem()
fd := uintptr(v.FieldByName("sysfd").Int())
addr := l.Addr()
name := fmt.Sprintf("%s:%s->", addr.Network(), addr.String())
return fd, name
}
func CloneListener(l net.Listener) (net.Listener, error) {
fd, fdName := GetFD(l)
return net.FileListener(os.NewFile(fd, fdName))
}
func serve(l net.Listener) {
for {
c, err := l.Accept()
if err != nil {
log.Printf("Listener exiting: err: %s", err)
return
}
log.Printf("Listener accepted connection")
out := ""
scanner := bufio.NewScanner(c)
for scanner.Scan() {
out += scanner.Text()
// our null handler doesn't send a body, so we know the request is
// done when we reach the blank line after the headers
if scanner.Text() == "" {
break
}
}
log.Printf("Client read: %s", out)
c.Write([]byte("Hello, world!\n"))
c.Close()
}
}
func send(addr string) (string, error) {
conn, err := net.Dial("tcp", addr)
if err != nil {
return "", fmt.Errorf("failed to dial, error: %s", err)
}
defer conn.Close()
_, err = conn.Write([]byte("GET / HTTP/1.1\nHost: localhost:8000\n\n"))
if err != nil {
return "", fmt.Errorf("failed to write, error: %s", err)
}
log.Printf("Scanner read the response, reading headers")
out := ""
scanner := bufio.NewScanner(conn)
for scanner.Scan() {
out += scanner.Text()
// our null handler doesn't send a body, so we know the request is
// done when we reach the blank line after the headers
if scanner.Text() == "" {
break
}
}
return out, scanner.Err()
}
func withClone() {
addr := "127.0.0.1:48879"
l, err := net.Listen("tcp", addr)
if err != nil {
log.Fatalln(err)
}
log.Println("listening on", l.Addr())
go serve(l)
l2, err := CloneListener(l)
if err != nil {
log.Fatalln(err)
}
go serve(l2)
if err := l.Close(); err != nil {
log.Fatalln(err)
}
out, err := send(addr)
log.Printf("Client got response: %s, error: %s", out, err)
}
func withoutClone() {
addr := "127.0.0.1:48879"
l, err := net.Listen("tcp", addr)
if err != nil {
log.Fatalln(err)
}
log.Println("listening on", l.Addr())
go serve(l)
out, err := send(addr)
log.Printf("Client got response: %s, error: %s", out, err)
if err := l.Close(); err != nil {
log.Fatalln(err)
}
}
func main() {
withClone()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment