-1
我用做在服务器端的插口上一次失败的关闭:在什么情况下在前台或后台完成关机/关闭?
struct linger so_linger;
so_linger.l_onoff = 1;
so_linger.l_linger = 0;
setsockopt(s, SOL_SOCKET, SO_LINGER, &so_linger, socklen_t)sizeof(so_linger));
shutdown(s, SHUT_WR);
close(s);
哪里s
是我关闭套接字。
它的工作原理,但我有时遇到问题,它似乎影响一些服务器,而不是其他人。一些在Ubuntu上运行,一些在CoreOS上运行。它在CoreOS上运行良好。
在Ubuntu上,尽管关闭了调用,但我仍然从与套接字相关的epoll_wait中获取了一个事件。
我认为这会立即发生。但是,如果你使用非阻塞I/O,我想这可能不是这种情况。
它基本上意味着我在epoll_wait中获得了一个ev.data.ptr值集合中指向已被销毁的事件的事件。
所以,问题是,这是真的吗?半关闭不会从epoll中删除事件描述符,并且关闭将不会与非阻塞I/O同步?
因此,如果我不再需要事件,我应该实际上用EPOLL_CTL_DEL手动删除描述符?
您正在发送FIN然后是RST。为什么? – EJP
@EJP - 你的意思是这不是在做一个失败的关闭?它似乎虽然工作。 – Matt