diff --git a/Makefile b/Makefile index 53b5f3e..ad96987 100644 --- a/Makefile +++ b/Makefile @@ -17,4 +17,6 @@ null_server_epoll: null_server_epoll.cpp null_server_thread: null_server_thread.cpp $(CXX) $(CXXFLAGS) -o $@ $< - +echo_server_go: echo_server_go.go + 6g -o echo_server_go.6 $< + 6l -o $@ echo_server_go.6 diff --git a/echo_server_go.go b/echo_server_go.go new file mode 100644 index 0000000..45bf464 --- /dev/null +++ b/echo_server_go.go @@ -0,0 +1,47 @@ +// Original: http://d.hatena.ne.jp/tokuhirom/20091112/1257995906 + +package main +import ( + "net"; + "os"; + "fmt"; +) + +func Err(format string, v ...os.Error) { + fmt.Fprintf(os.Stderr, format + "\n", v) +} + +func Handler(conn net.Conn) { + defer conn.Close(); + + buffer := make([]byte, 24); + for { + l, e := conn.Read(buffer); + switch { + case e == nil: + conn.Write(buffer[0:l]) + case e == os.EOF: + return; + case e != os.EAGAIN: + Err("Err on receiving a header (%s)", e); + return; + } + } +} + +func main() { + psock, e := net.Listen("tcp", ":5000"); + if e != nil { + Err("an error occured(%s)", e); + return + } + + for { + conn, e := psock.Accept(); + if e != nil { + Err("an error occured(%s)", e); + return + } + go Handler(conn); + } +}