-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