Проблема, читающая из сокета в движении

Я пытаюсь выучить язык движения, и я пишу простой сервер эха. Я испытываю затруднения, заставляя это работать, все же.

func listen(server string) {
    var buf []byte

    listener, ok := net.Listen("tcp", server)
    if ok != nil {
        fmt.Fprintf(os.Stderr, "Could not listen on socket: %s\n", ok.String())
        return
    }
    conn, ok := listener.Accept()
    if ok != nil {
        fmt.Fprintf(os.Stderr, "Could not accept connection on socket: %s\n", ok.String())
        return
    }

    writelen, ok := conn.Write(strings.Bytes("Ready to receive\n"))
    if ok != nil {
        fmt.Fprintf(os.Stderr, "Could not write to socket: %s\n", ok.String())
    } else {
        fmt.Printf("Wrote %d bytes to socket\n", writelen)
    }

    for ;; {
        readlen, ok := conn.Read(buf)
        if ok != nil {
            fmt.Fprintf(os.Stderr, "Error when reading from socket: %s\n", ok.String())
            return
        }
        if readlen == 0 {
            fmt.Printf("Connection closed by remote host\n")
            return
        }

        fmt.Printf("Client at %s says '%s'\n", conn.RemoteAddr().String(), buf)
    }
}

Я получаю следующий вывод от этой функции:

[nathan@ebisu ~/src/go/echo_server] ./6.out 1234
Using port 1234
Wrote 17 bytes to socket
Error when reading from socket: EOF

Это - то, что я вижу на клиенте:

[nathan@ebisu ~] telnet 127.0.0.1 1234
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Ready to receive
Connection closed by foreign host.

Любая справка ценилась бы (или указатели на ресурсы; документация движения относительно сокетов API уезжает немного для желания).

Спасибо,

Nathan

5
задан hannson 4 March 2010 в 21:49
поделиться

2 ответа

В вашем примере buf должен иметь определенный размер. Вы объявили его как фрагмент длиной 0.

Объявите его как:

var buf = make([]byte, 1024)
8
ответ дан 13 December 2019 в 22:07
поделиться

Конечно, если хотите научиться, лучше написать самому, но, если поможет, вот мой собственный эхо-сервер на Go.

package main

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

func handle(conn *net.TCPConn) {
    fmt.Printf("Connection from %s\n", conn.RemoteAddr());
    message := make([]byte, 1024);
    // TODO: loop the read, we can have >1024 bytes
    n1, error := conn.Read(message);
    if error != nil {
        fmt.Printf("Cannot read: %s\n", error);
        os.Exit(1);
    }
    n2, error := conn.Write(message[0:n1]);
    if error != nil || n2 != n1 {
        fmt.Printf("Cannot write: %s\n", error);
        os.Exit(1);
    }
    fmt.Printf("Echoed %d bytes\n", n2);
    conn.Close();   // TODO: wait to see if more data? It would be better with telnet...
}

func main() {
    listen := ":7";
    addr, error := net.ResolveTCPAddr(listen);
    if error != nil {
        fmt.Printf("Cannot parse \"%s\": %s\n", listen, error);
        os.Exit(1);
    }
    listener, error := net.ListenTCP("tcp", addr);
    if error != nil {
        fmt.Printf("Cannot listen: %s\n", error);
        os.Exit(1);
    }
    for {   // ever...
        conn, error := listener.AcceptTCP();
        if error != nil {
            fmt.Printf("Cannot accept: %s\n", error);
            os.Exit(1);
        }
        go handle(conn);
    }
}
2
ответ дан 13 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: