2016-04-09 4 views
1

マイコード:GoソケットサーバーにEOFエラーがありますか?

var connMax int = 0 

    func CheckErr(err error) { 
     if err != nil { 
      fmt.Fprintf(os.Stderr, "Error occured: %s\n", err) 
      os.Exit(1) 
     } 
    } 

    func handler(conn net.Conn) { 
     defer conn.Close() 

     var buf [512]byte 
     n, err := conn.Read(buf[0:]) 
     CheckErr(err) 

     connMax += 1 
     fmt.Println(connMax) 

     result := bytes.NewBuffer(nil) 
     result.Write(buf[0:n]) 

     fmt.Println(string(result.Bytes())) 

     conn.Write([]byte("HTTP/1.1 201 OK\r\n")) 

    func Run() { 
     ln, err := net.Listen("tcp", ":8080") 
     CheckErr(err) 
     for { 
      conn, err := ln.Accept() 
      CheckErr(err) 
      go handler(conn) 
     } 
    } 

私はパッケージのapache2-utilsのコマンドのabでテストサーバーに試してみました。 ab -c 1500 -n 10000 http://127.0.0.1:8080/

その完成し、EOFエラーが発生したので、プロセスの終了後:

enter image description here
+0

開いているファイル記述子はいくつありますか?それを確認するには 'ulimit -a'を使います。私はそれが10000未満だと思います。 – jfly

+0

また参照してくださいhttp://stackoverflow.com/questions/30352725/why-is-my-hello-world-go-server-getting-crushed-by-apachebench – JimB

答えて

0

io.EOF接続が他方の端部によって閉じられていることを示しています。私はabがオープンファイル記述子の制限に達しているので、接続が閉じられていると思います。確認するにはulimit -aを使用してください。 10000未満の場合は、ulimit -n 65536を使用して変更してください。これは10000以上の接続を可能にするためです。私はランダムに65536を選択し、これを行うにはルート権限が必要です。

関連する問題