Skip to content
New issue

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

报错 socket operation on non-socket #36

Closed
tangtaoit opened this issue Jul 1, 2020 · 3 comments
Closed

报错 socket operation on non-socket #36

tangtaoit opened this issue Jul 1, 2020 · 3 comments

Comments

@tangtaoit
Copy link

系统:
CentOS Linux release 7.7.1908 (Core)

复现:

将example/echo的代码里的 out = data 改为 c.Send(data)

然后执行

go run echo.go

tcpkali --workers 8 -c 200 -T 30s -em "\x70" 127.0.0.1:1833

// HandleEvent 内部使用,供 event loop 回调处理事件
func (l *Listener) HandleEvent(fd int, events poller.Event) {
	if events&poller.EventRead != 0 {
		nfd, sa, err := unix.Accept(fd)
		if err != nil {
			if err != unix.EAGAIN {
				log.Error("accept:", err)
			}
			return
		}
		if err := unix.SetNonblock(nfd, true); err != nil {
			_ = unix.Close(nfd)
			log.Error("set nonblock:", err)
			return
		}

		l.handleC(nfd, sa)
	}
}

将会执行 log.Error("accept:", err) 的代码 err是 socket operation on non-socket或 bad file descriptor

@Allenxuxu
Copy link
Owner

我现在手头没Linux电脑,晚上试一下。

你说的现象是必现吗?

out = data 和 c.Send(data) ,两种会有不同的现象吗?

@tangtaoit
Copy link
Author

out = data 和 c.Send(data) 好像没不同现象 在linux下使用epoll就会有这种情况 listene改为如下就好了

       acceptFd, err := unix.Socket(unix.AF_INET, unix.SOCK_STREAM, 0)
	if err != nil {
		panic(err)
	}
	_, _, port := parseAddr(s.addr)
	sockaddrInet4 := &unix.SockaddrInet4{
		Port: port,
		Addr: [4]byte{0, 0, 0, 0},
	}
	err = unix.Bind(acceptFd, sockaddrInet4)
	if err != nil {
		panic(err)
	}
	err = unix.Listen(acceptFd, 100)
	if err != nil {
		panic(err)
	}

@Allenxuxu
Copy link
Owner

可以提供一下运行报错的log截图吗

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants