sockets - golang net.UDPConn 和 net.TCPConn 线程安全吗??我可以在多线程中读取或写入单个 UDPConn 对象吗?

标签 sockets go thread-safety

1.我们能否在同一个 net.UDPConn 或 net.TCPConn 对象上从一个线程调用发送并从另一个线程调用接收?

2.我们能否从同一 net.UDPConn 或 net.TCPConn 对象上的不同线程并行调用多个发送?

我也找不到同样好的文档。 golang socket api线程安全吗?

我发现很难测试它是否是线程安全的。 方向上的任何指示都会有所帮助。

我的测试代码如下:

package main

import (
    "fmt"
    "net"
    "sync"
)

func udp_server() {
    // create listen
    conn, err := net.ListenUDP("udp", &net.UDPAddr{
        IP:   net.IPv4(0, 0, 0, 0),
        Port: 8080,
    })
    if err != nil {
        fmt.Println("listen fail", err)
        return
    }
    defer conn.Close()

    var wg sync.WaitGroup
    for i := 0; i < 10; i = i + 1 {
        wg.Add(1)
        go func(socket *net.UDPConn) {
            defer wg.Done()
            for {
                // read data
                data := make([]byte, 4096)
                read, remoteAddr, err := socket.ReadFromUDP(data)
                if err != nil {
                    fmt.Println("read data fail!", err)
                    continue
                }
                fmt.Println(read, remoteAddr)
                fmt.Printf("%s\n\n", data)

                // send data
                senddata := []byte("hello client!")
                _, err = socket.WriteToUDP(senddata, remoteAddr)
                if err != nil {
                    return
                    fmt.Println("send data fail!", err)
                }
            }
        }(conn)
    }
    wg.Wait()
}

func main() {
    udp_server()
}

这个测试代码可以吗?

最佳答案

net.Conn 的文档说:

Multiple goroutines may invoke methods on a Conn simultaneously.

关于sockets - golang net.UDPConn 和 net.TCPConn 线程安全吗??我可以在多线程中读取或写入单个 UDPConn 对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28575758/

相关文章:

macos - Mac OS X 上与防火墙相关的奇怪套接字泄漏

multithreading - 在不涉及先前数据计算的情况下更改变量是否是线程安全的?

c# - 如何在 C# 中实现线程安全的无错误事件处理程序?

go - 运行前如何通过gin合并多个路由器

ios - 如果我们使用 GCD,我们需要声明一个属性 atomic 吗?

Python WSS : chrome not recognizing auto validated certificate

C++ udp recvfrom 减少滴

c# - 什么条件导致 NetworkStream.Write 阻塞?

performance - 有没有更有效的函数来查找[]字节相似度?

go - 如何向 gorilla websocket 的 CheckOrigin 添加可信来源?