Go最新socket 的阻塞模式和非阻塞模式_socket阻塞和非阻塞,Golang源码的Binder权限是如何控制
在Go语言中,socket的阻塞和非阻塞模式可以通过设置socket的选项来控制。这里提供一个简单的例子来展示如何设置socket的阻塞和非阻塞模式。
package main
import (
"net"
"syscall"
"time"
"fmt"
)
func main() {
// 创建一个TCP socket
conn, err := net.Dial("tcp", "localhost:8080")
if err != nil {
panic(err)
}
defer conn.Close()
// 设置为非阻塞模式
err = setNonBlocking(conn)
if err != nil {
panic(err)
}
// 在非阻塞模式下,尝试读取数据
go func() {
buf := make([]byte, 512)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("Read error:", err)
} else {
fmt.Printf("Received: %s\n", string(buf[:n]))
}
}()
// 等待一段时间,以便在控制台看到效果
time.Sleep(10 * time.Second)
}
// 设置socket为非阻塞模式
func setNonBlocking(conn net.Conn) error {
// 获取socket文件描述符
file, err := conn.(*net.TCPConn).File()
if err != nil {
return err
}
defer file.Close()
// 设置为非阻塞
return syscall.SetNonblock(file.Fd(), true)
}
在这个例子中,我们首先创建了一个TCP socket连接,然后调用setNonBlocking
函数将其设置为非阻塞模式。在非阻塞模式下,当尝试读取数据时,如果没有数据可读,不会阻塞等待,而是会返回一个错误。这种模式常用于处理网络事件或高性能服务器编写。需要注意的是,syscall.SetNonblock
函数是特定于Unix系统的,不适用于Windows平台。
评论已关闭