gpt4 book ai didi

sockets - 我需要一个用于套接字的写缓冲区吗?

转载 作者:IT王子 更新时间:2023-10-29 01:39:41 26 4
gpt4 key购买 nike

假设我在 Linux 中有一个 Tcp 服务器,它会为一个新的连接创建一个新的 goroutine。当我想向tcp连接写入数据时,是不是应该这样写

conn.Write(data)

或者在 goroutine 中做,特别是为了写作,像这样

func writeRoutine(sendChan chan []byte){
for {
select {
case msg := <- sendChan :
conn.Write(msg)
}
}
}

以防网络繁忙。

简而言之,在写入套接字时,我是否需要像在 c/c++ 中一样在 go 中写入缓冲区?

PS 可能是我没把问题说清楚。

1 我说的是服务器,意思是运行在linux中的tcp服务器。它将为新的连接创建一个新的 goroutine。像这样

   listener, err := net.ListenTCP("tcp", tcpAddr)
if err != nil {
log.Error(err.Error())
os.Exit(-1)
}
for {
conn, err := listener.AcceptTCP()
if err != nil {
continue
}
log.Debug("Accept a new connection ", conn.RemoteAddr())
go handleClient(conn)
}

2 我认为我的问题与代码无关。正如我们所知,当我们使用 size_t write(int fd, const void *buf, size_t count); 在 c/c++ 中写一个 socket fd 时,对于一个 tcp 服务器,我们需要一个写缓冲区用于您的代码中必须有一个套接字,或者可能只有部分数据被成功写入。我的意思是,我必须这样做吗?

最佳答案

你实际上是在问两个不同的问题:

1) 你应该在我的 TCP 服务器中为每个接受的客户端连接使用一个 goroutine 吗?2) 给定一个 []byte,我应该如何写入连接?

对于1),答案是肯定的。这是 go 最适合的模式类型。如果您查看 net/http 的源代码,您会看到它为每个连接生成一个 goroutine。

至于 2),您应该像在 c/c++ 服务器中那样做:写入,检查写入了多少并继续写入直到完成,始终检查错误。这是有关如何执行此操作的代码片段:

func writeConn(data []byte) error {
var start,c int
var err error
for {
if c, err = conn.Write(data[start:]); err != nil {
return err
}
start += c
if c == 0 || start == len(data) {
break
}
}
return nil
}

关于sockets - 我需要一个用于套接字的写缓冲区吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28187519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com