ここにこのコードがあります
https://gist.github.com/ChasingLogic/8324442
Golang を使用してネットワーク プログラミングを学ぼうとしていますが、これは同時実行の最初の試みであり、目標は、メッセージが送信され、接続されているすべてのクライアントにエコーされる IRC サーバーを簡素化することと同等です。
何らかの理由で、私のコードはチャネルにデータを送信することはありません。エラーチェックを入れると、EOFが無限に吐き出されます。
ここにこのコードがあります
https://gist.github.com/ChasingLogic/8324442
Golang を使用してネットワーク プログラミングを学ぼうとしていますが、これは同時実行の最初の試みであり、目標は、メッセージが送信され、接続されているすべてのクライアントにエコーされる IRC サーバーを簡素化することと同等です。
何らかの理由で、私のコードはチャネルにデータを送信することはありません。エラーチェックを入れると、EOFが無限に吐き出されます。
2 つの問題があります。
1 つ目は簡単です。「var buf []byte」の代わりに「buf := make([]byte, 1024)」を使用するだけです。
2枚目は詳しく。
あなたが持っているhandleClientで
fmt.Println(string(buf[0:n]))
mesg <- buf[0:n]
fmt.Println(mesg)
ind <- n
fmt.Println(ind)
したがって、最初にメッセージを送信してから、メッセージの長さを送信します。しかし、受信側には次のものがあります。
n := <-ind
fmt.Println("N recieved")
buf := <-mesg
fmt.Println("Channels recieved")
したがって、メッセージ自体の前にメッセージの長さを期待します。したがって、デッドロックが発生します。送信者はメッセージの長さを送信する前に誰かがメッセージを受信するのを待っていますが、受信者はメッセージを受信する前にメッセージの長さを受信するのを待っています。
handleClient を逆の順序に変更するだけで機能します。
fmt.Println(string(buf[0:n]))
ind <- n
mesg <- buf[0:n]
fmt.Println(mesg)
fmt.Println(ind)