相关疑难解决方法(0)

Golang net.Conn并行写入

我有多个Goroutines共享一个net.Conn对象.他们可以同时发出写呼叫吗?

我主要担心的是部分完成的写调用.假设我打算写100个字节,但只发送了30个字节,所以我需要再发送70个字节.为此,我通常会写一个循环:

count := 0
for count < len(buf) {
    byteSent, err := conn.Write(buf[count:])
    //check error 

    count += byteSent
}
Run Code Online (Sandbox Code Playgroud)

但是我看到Go在net.Conn.Write行号318中实现了这个循环,它通过锁定来实现.

但是,在Windows实现中,除了调用WSASend之外没有这样的循环.我不知道WSASend的行为如何,也无法从MSDN文档中获得太多

因此问题是:

[编辑]添加第4个问题

  1. 每次写入socket时我是否需要获取锁?
  2. 如果是,那么在Write实现中获取锁定的目的就会失败.
  3. 在unix实现中,它是否意味着我不能得到byteSent <len(buf),除非err!= nil?(我的意思是我正在读代码吗?)
  4. Windows上的WSASend是否在Unix实现中实现了等效循环

network-programming go

3
推荐指数
2
解决办法
2564
查看次数

标签 统计

go ×1

network-programming ×1