Какова цель отсрочки в прослушивателе соединений TCP - PullRequest
0 голосов
/ 09 июля 2020

Недавно я начал изучать TCP, я понимаю, как работает defer с точки зрения создания файлов и некоторых других вещей, но что я не понимаю в использовании defer в TCP, так это того, что когда сервер прослушивает входящий запрос, он как бесконечность l oop, так что TCP никогда не прекращает прослушивание запроса, за исключением того, что он прерывается командной строкой.

Возьмем, например, следующий код:

package main

import (
    "fmt"
    "log"
    "net"
)

func listenConnection(conn net.Conn) {
    for {
        buffer := make([]byte, 1400)
        size, err := conn.Read(buffer)
        if err != nil {
            fmt.Printf("Connection closed")
            return
        }

        data := buffer[:size]
        fmt.Printf("recieved message %s", data)

        _, err = conn.Write(data)
        if err != nil {
            log.Fatalln(err)
        }
    }
}
func main() {
    fmt.Println("Listening to localhost:5000")
    listener, err := net.Listen("tcp", "localhost:5000")
    if err != nil {
        log.Fatalln(err)
    }

    defer listener.Close()

    for {
        conn, err := listener.Accept()
        if err != nil {
            log.Fatalln(err)
        }
        fmt.Println("New connection")
        go listenConnection(conn )
    }
}

Как оператор defer работает в таком сценарии?

1 Ответ

1 голос
/ 09 июля 2020

Он работает одинаково в любом контексте: он выполняется после завершения содержащей функцию. В этом случае, когда завершается работа main(), запускается отложенная функция.

Кажется, ваше замешательство связано с идеей, что в main() существует бесконечное l oop. На самом деле его нет: l oop завершится, когда listener.Accept() вернет ошибку, потому что тогда вызывается log.Fatal, который завершает всю программу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...