私は単純なUDPサーバをgoに書いています。golang UDPサーバの奇妙な動作
私がgo run udp.go
を送信すると、送信したすべてのパッケージが印刷されます。しかし、go run udp.go > out
を実行すると、クライアントが停止するとout
ファイルにstdout
が渡されなくなります。
クライアントは、10k要求を送信する単純なプログラムです。したがって、ファイルには、送信されるパッケージの約50%があります。クライアントを再実行すると、クライアントスクリプトが終了するまでファイルout
が再び大きくなります。
Serverコード:
package main
import (
"net"
"fmt"
)
func main() {
addr, _ := net.ResolveUDPAddr("udp", ":2000")
sock, _ := net.ListenUDP("udp", addr)
i := 0
for {
i++
buf := make([]byte, 1024)
rlen, _, err := sock.ReadFromUDP(buf)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(buf[0:rlen]))
fmt.Println(i)
//go handlePacket(buf, rlen)
}
}
そして、ここでは、クライアントコードは次のとおりです。
package main
import (
"net"
"fmt"
)
func main() {
num := 0
for i := 0; i < 100; i++ {
for j := 0; j < 100; j++ {
num++
con, _ := net.Dial("udp", "127.0.0.1:2000")
fmt.Println(num)
buf := []byte("bla bla bla I am the packet")
_, err := con.Write(buf)
if err != nil {
fmt.Println(err)
}
}
}
}
クライアントとサーバーの両方で、いくつかの考えられるエラーを無視しています。クライアントを実行すると、すぐに実行時エラーが発生しました。エラーチェックを追加した後: "dial udp 127.0.0.1:2000:開いているファイルが多すぎます"。あなたの問題が関連しているかどうかわからない場合は、すべての可能性のあるエラーのチェックを追加するように依頼し、それがあなたの問題の解決につながっていない場合は、結果をここに戻してください:) – fresskoma
Iエラーチェックを追加し、そのような問題はありません。クライアントが動作し、別のサーバーでテストしました。それは、リダイレクションがソケットの読み込みに遅れを起こすように見え、いくつかのパケットは見逃しています.... –