【发布时间】:2014-07-09 15:50:59
【问题描述】:
我正在开发一个简单的 Go 服务器程序,它接收客户端的请求并处理它。并且代码简化为:
package main
import (
"fmt"
"net"
"os"
)
const (
pduLen = 32
)
func checkError(err error) {
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
func main() {
var buffer [4096]byte
var count int
conn, err := net.Dial("tcp", fmt.Sprintf("%s:%s", os.Args[1], os.Args[2]))
checkError(err)
for count < pduLen {
n, err := conn.Read(buffer[count:])
checkError(err)
count += n
}
......
}
我假设每个请求的长度都是32 字节(只是一个例子)。因为TCP是流协议,所以我需要使用循环来检查是否读取了一个完整的PDU:
for count < pduLen {
n, err := conn.Read(buffer[count:])
checkError(err)
count += n
}
是否有任何方法可以确保读取完整的 PDU?就个人而言,我认为循环代码有点难看。
【问题讨论】:
-
像github.com/PreetamJinka/fickle/blob/… 这样的东西有帮助吗?即:读取大小,然后在一次
Read()调用中读取所有消息 -
@VonC:以前不知道的方法,谢谢!
-
好的,我已经添加了一个答案,看看是否有效。
标签: tcp network-programming go