Igni Serpens
Igni Serpens

Reputation: 89

Set the time for connection's life in Golang

I am a novice in golang and I am writing a client-server application through the TCP protocol. I need to make a temporary connection, which will close after a couple of seconds. I don't understand how to do that.
I have a such function, which creates a connection and waits for gob data:

    func net_AcceptAppsList(timesleep time.Duration) {
        ln, err := net.Listen("tcp", ":"+conf.PORT)
        CheckError(err)
        conn, err := ln.Accept()
        CheckError(err)
        dec := gob.NewDecoder(conn)
        pack := map[string]string{}
        err = dec.Decode(&pack)
        fmt.Println("Message:", pack)
        conn.Close()
}

I need to make this function to wait for data for only some seconds - not forever.

Upvotes: 2

Views: 16026

Answers (2)

Mr_Pink
Mr_Pink

Reputation: 109347

Use SetDeadline or SetReadDeadline

From the net.Conn docs

    // SetDeadline sets the read and write deadlines associated
    // with the connection. It is equivalent to calling both
    // SetReadDeadline and SetWriteDeadline.
    //
    // A deadline is an absolute time after which I/O operations
    // fail with a timeout (see type Error) instead of
    // blocking. The deadline applies to all future I/O, not just
    // the immediately following call to Read or Write.
    //
    // An idle timeout can be implemented by repeatedly extending
    // the deadline after successful Read or Write calls.
    //
    // A zero value for t means I/O operations will not time out.
    SetDeadline(t time.Time) error

    // SetReadDeadline sets the deadline for future Read calls.
    // A zero value for t means Read will not time out.
    SetReadDeadline(t time.Time) error

    // SetWriteDeadline sets the deadline for future Write calls.
    // Even if write times out, it may return n > 0, indicating that
    // some of the data was successfully written.
    // A zero value for t means Write will not time out.
    SetWriteDeadline(t time.Time) error

If you want the Accept call to timeout, you can use the TCPListener.SetDeadline method.

ln.(*net.TCPListener).SetDeadline(time.Now().Add(time.Second))

Optionally, you could have a timer call Close() or CloseRead() on the connection, or Close() on the net.Listener, but that won't leave you with the cleaner timeout error.

Upvotes: 6

Igni Serpens
Igni Serpens

Reputation: 89

As @JimB said in comments, we need to use another listener - net.TCPListener, which have method SetDeadline, setting the connection lifetime, while the standart net.Listener doesn't have it.

Upvotes: 0

Related Questions