|
|
|
|
@ -426,7 +426,7 @@ static void error_cb(socket_t sock, void* arg) {
|
|
|
|
|
struct tcp_conn* tc = (struct tcp_conn*)arg; |
|
|
|
|
if (!tc || tc->sock == SOCKET_INVALID) return; |
|
|
|
|
int so_err = 0; socklen_t so_len = sizeof(so_err); |
|
|
|
|
if (getsockopt(tc->sock, SOL_SOCKET, SO_ERROR, &so_err, &so_len) == 0 && so_err == 0) { |
|
|
|
|
if (getsockopt(tc->sock, SOL_SOCKET, SO_ERROR, (char*)&so_err, &so_len) == 0 && so_err == 0) { |
|
|
|
|
// Peer полностью закрыл свой сокет (EPOLLHUP) после того, как FIN уже прочитан (fin_remote=1).
|
|
|
|
|
// EPOLLHUP — level-triggered и «always reported»: если оставить сокет в epoll, каждая итерация
|
|
|
|
|
// epoll_wait мгновенно вернёт HUP и error_cb зациклится на 100% CPU. Закрываем сокет.
|
|
|
|
|
|