Конн закрывается случайно и без предупреждения в Go - PullRequest
0 голосов
/ 26 февраля 2019

Я строю алгоритм эха в go с несколькими инициаторами, по сути, у меня есть три функции «говорить», «слушать» и «запустить алгоритм».«talk» отправляет данные соседям, «слушает» полученные данные от соседей, оба используют каналы.Эти каналы контролируются в функциях «алгоритм выполнения», которые решают, что и кому отправлять.

По существу это:

func server(s Node, myChannel chan string){
fmt.Printf("SERVER Launching server... %s:%s \n", s.ip, s.port)

// Start listening

// We do not stop listening until the surrounding function returns (finishes)
ln, _ := net.Listen("tcp", s.ip+":"+s.port)
for {

    // Accept connections
    fmt.Println("SERVER waiting at ln.Accept()")
    conn, err := ln.Accept()

    if err != nil {
        panic(err)
    }

    //fmt.Println("SERVER connection accepted")

    // Read received message
    fmt.Println("SERVER awaiting message")
    message, err := bufio.NewReader(conn).ReadString('\n')
    fmt.Println("SERVER message received = " + message)
    if err != nil {
        fmt.Println("the server is broken")
        panic(err)
    }

    if err == nil {

        // If the mmessage is not empty, then print it in the shell

        if string(message) != "" {
            fmt.Println("SERVER message put in channel")
            myChannel <- message

        }
    }
}

И функция разговора как эта:

func client(myNode Node, nbour Node, myChannel chan string) {
    for {
    // this loop controls the sending of algorithm messages

    conn, err = net.Dial("tcp", nbour.ip+":"+nbour.port)

    // useful info for the user
    //fmt.Println("CLIENT awaiting message to send")

    // the the message to send out of the channel
    messageToSend := <-myChannel

    // send the message
    conn.Write([]byte(messageToSend))

    fmt.Println("CLIENT SENT ALG MESSAGE = " + messageToSend + "to " + nbour.ip + ":" + nbour.port)

    // useful information for the user
    //fmt.Printf("CLIENT Message text: " + messageToSend. + "\n")


}

Проблема в том, что эти соединения работают, находят первые несколько сообщений, затем в некоторой произвольной точке один узел отправляет сообщение, а сосед не получает его, и все останавливается.

Таким образом, мой вопрос - почемупроизвольно ли прерываются соединения, есть ли где-то параметр, указывающий, как долго оставаться открытым или сколько сообщений отправлять?Или приведенный выше код был неправильным для достижения этой цели (хотя, как я уже говорил, иногда он работает нормально, фактически иногда алгоритм завершается идеально, затем я снова запускаю точно такой же код, и он застревает в ожидании прибытия сообщений).

1 Ответ

0 голосов
/ 26 февраля 2019

Похоже, что проблема заключается в установлении соединения и ТО, ожидающих что-то, что будет помещено в канал.Если вы вместо этого ждете, чтобы что-то было помещено в канал, ТО (после того, как что-то удалено из канала) создайте соединение (и закройте соединение, как предложено @leaf bebop), код работает нормально каждый раз.(см. ниже)

func client(myNode Node, nbour Node, myChannel chan string) {
for {
// this loop controls the sending of algorithm messages

// useful info for the user
//fmt.Println("CLIENT awaiting message to send")

// the message to send out of the channel
messageToSend := <-myChannel

conn, err = net.Dial("tcp", nbour.ip+":"+nbour.port)

// send the message
conn.Write([]byte(messageToSend))
conn.Close()

fmt.Println("CLIENT SENT ALG MESSAGE = " + messageToSend + "to " + nbour.ip + ":" + nbour.port)

// useful information for the user
//fmt.Printf("CLIENT Message text: " + messageToSend. + "\n")

}

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