Linux CentOS 5: неблокирующая отправка сокета зависает бесконечно

У меня есть следующий код C ++ в Linux:

if (epoll_wait(hEvent,&netEvents,1,0))
{
// check FIRST for disconnection to avoid send() to a closed socket (halts on centos on my server!)
if ((netEvents.events & EPOLLERR)||(netEvents.events & EPOLLHUP)||(netEvents.events & EPOLLRDHUP)) {
save_log("> client terminated connection");
goto connection_ended;              // ---[ if its a CLOSE event .. close :)
}
if (netEvents.events & EPOLLOUT)                 // ---[ if socket is available for write
{
if (send_len) {
result = send(s,buffer,send_len,MSG_NOSIGNAL);
save_slogf("1112:send (s=%d,len=%d,ret=%d,errno=%d,epoll=%d,events=%d)",s,send_len,result,errno,hEvent,netEvents.events);
if (result > 0) {
send_len = 0;
current_stage = CL_STAGE_USE_LINK_BRIDGE;
if (close_after_send_response) {
save_log("> destination machine closed connection");
close_after_send_response = false;
goto connection_ended;
}
} else {
if (errno == EAGAIN) return;
else if (errno == EWOULDBLOCK) return;
else {
save_log("> unexpected error on socket, terminating");
connection_ended:
close_client();
reset();
return;
}
}
}
}
}
}

hEvent: epoll создан для прослушивания EPOLLIN, EPOLLOUT, EPOLLERR, EPOLLHUP, EPOLLRDHUP

s: НЕБЛОКИРУЮЩИЙ (!!!) сокет, созданный из принятия на неблокирующем сокете прослушивания

По сути, этот код пытается отправить пакет обратно подключенному пользователю, который подключился к серверу. Обычно это работает нормально, но в СЛУЧАЙНЫХ случаях (возможно, когда происходит какое-то странное сетевое событие) программа зависает на неопределенный срок в строке «result = send (s, buffer, send_len, MSG_NOSIGNAL)».

Я понятия не имею, что может быть причиной этого, я пытался отслеживать операции с сокетами, и ничто не давало мне подсказку о том, почему это происходит. Я должен предположить, что это либо ошибка KERNEL, либо что-то очень странное, потому что у меня есть та же самая программа, написанная под Windows, и она прекрасно работает там.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]