We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
go version 1.13.9 linux/mips64le
go env
GO111MODULE="on" GOARCH="mips64le" GOMIPS64="hardfloat"
here is my code.
package main
import ( "fmt" "log" "syscall" )
const ( epollEvents = 100 bufferSize = 1024 )
func main() { // 创建监听套接字 listenFD, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, 0) if err != nil { log.Fatalf("创建socket错误: %v", err) } defer syscall.Close(listenFD)
// 设置地址复用 err = syscall.SetsockoptInt(listenFD, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) if err != nil { log.Fatalf("设置地址复用错误: %v", err) } // 绑定地址和端口 addr := syscall.SockaddrInet4{Port: 8080} copy(addr.Addr[:], []byte{0, 0, 0, 0}) // 绑定到所有IPv4地址 if err := syscall.Bind(listenFD, &addr); err != nil { log.Fatalf("绑定socket错误: %v", err) } // 开始监听 if err := syscall.Listen(listenFD, syscall.SOMAXCONN); err != nil { log.Fatalf("监听错误: %v", err) } fmt.Println("监听器已启动,监听端口: 8080") // 创建epoll实例,带有CLOEXEC标志 epollFD, err := syscall.EpollCreate1(syscall.EPOLL_CLOEXEC) if err != nil { log.Fatalf("创建epoll实例错误: %v", err) } defer syscall.Close(epollFD) // 将监听套接字的文件描述符注册到epoll中 ev := syscall.EpollEvent{Events: syscall.EPOLLIN, Fd: int32(listenFD)} if err := syscall.EpollCtl(epollFD, syscall.EPOLL_CTL_ADD, listenFD, &ev); err != nil { log.Fatalf("注册监听FD到epoll错误: %v", err) } // 创建 eventfd 实例 eventFD, _, errno := syscall.Syscall(syscall.SYS_EVENTFD2, 0, 0, syscall.EFD_CLOEXEC) if errno != 0 { log.Fatalf("创建eventfd错误: %v", errno) } defer syscall.Close(int(eventFD)) // 将 eventfd 的文件描述符注册到 epoll 中 ev = syscall.EpollEvent{Events: syscall.EPOLLIN, Fd: int32(eventFD)} if err := syscall.EpollCtl(epollFD, syscall.EPOLL_CTL_ADD, int(eventFD), &ev); err != nil { log.Fatalf("注册eventfd到epoll错误: %v", err) } events := make([]syscall.EpollEvent, epollEvents) for { n, err := syscall.EpollWait(epollFD, events, -1) if err != nil { log.Fatalf("epoll等待错误: %v", err) } for i := 0; i < n; i++ { if events[i].Fd == int32(listenFD) { // 处理新的连接 connFD, _, err := syscall.Accept(listenFD) if err != nil { log.Printf("接受连接错误: %v", err) continue } // 将新连接的文件描述符注册到epoll中 ev := syscall.EpollEvent{Events: syscall.EPOLLIN, Fd: int32(connFD)} if err := syscall.EpollCtl(epollFD, syscall.EPOLL_CTL_ADD, connFD, &ev); err != nil { log.Printf("注册连接FD到epoll错误: %v", err) syscall.Close(connFD) continue } } else if events[i].Fd == int32(eventFD) { // 处理eventfd事件 var buf [8]byte if _, err := syscall.Read(int(eventFD), buf[:]); err != nil { log.Printf("读取eventfd错误: %v", err) } fmt.Println("eventfd事件触发") } else { // 处理现有连接的数据 handleConnection(int(events[i].Fd)) } } }
}
func handleConnection(fd int) { defer syscall.Close(fd) buf := make([]byte, bufferSize)
for { n, err := syscall.Read(fd, buf) if err != nil { log.Printf("读取连接错误: %v", err) return } if n == 0 { break } fmt.Printf("接收到数据: %s\n", string(buf[:n])) // Echo回客户端 _, err = syscall.Write(fd, buf[:n]) if err != nil { log.Printf("写入连接错误: %v", err) return } }
the event Fd of the events from function syscall.EpollWait is always zero, so that my program not work?
syscall.EpollWait function work normally
The text was updated successfully, but these errors were encountered:
Related Issues and Documentation
(Emoji vote if this was helpful or unhelpful; more detailed feedback welcome in this discussion.)
Sorry, something went wrong.
1.13 is not a version we support.
No branches or pull requests
Go version
go version 1.13.9 linux/mips64le
Output of
go env
in your module/workspace:What did you do?
here is my code.
package main
import (
"fmt"
"log"
"syscall"
)
const (
epollEvents = 100
bufferSize = 1024
)
func main() {
// 创建监听套接字
listenFD, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, 0)
if err != nil {
log.Fatalf("创建socket错误: %v", err)
}
defer syscall.Close(listenFD)
}
func handleConnection(fd int) {
defer syscall.Close(fd)
buf := make([]byte, bufferSize)
}
What did you see happen?
the event Fd of the events from function syscall.EpollWait is always zero, so that my program not work?
What did you expect to see?
syscall.EpollWait function work normally
The text was updated successfully, but these errors were encountered: