멀티스레드 서버에서 클라이언트의 종료를 알 수 있는 방법

익명 사용자의 이미지

리눅스 멀티스레드 서버를 만드는 중인데 클라이언트가 종료되었음을 아는 방법이 있을까요? 연결 요청이 들어올 때마다 클라이언트 소켓 디스크립터를 만들어서 스레드를 만들고 그 인자로 디스크립터를 전달하는데 epoll로 이 디스크립터를 관리하면서 EPOLLRDHUP 이벤트가 발생하는지 검사하려고 합니다. 사실 구현은 해보지 않아서 잘 작동하는지도, EPOLLRDHUP이 이렇게 사용하는건지도 감이 오지 않습니다. 어떻게 해야할까요?

jick의 이미지

구조가 잘 이해가 안 가는데요, 연결이 생길 때마다 스레드를 만들면 그 스레드는 자기가 맡은 단 한 개의 fd만 보면 되니까 그 스레드가 계속 read를 하면서 처리를 하다가 eof를 만나면 스레드를 끝내면 되는 거 아닌가요?

select/poll/epoll은 하나의 스레드가 여러 개의 connection을 관리해야 할 때 쓰는 거죠.

글쓴이의 이미지

메인 프로세스에서 listen()으로 기다리다가 연결요청이 들어오면 accept()로 클라이언트 소켓을 생성합니다. epoll 인스턴스에 이 클라이언트 소켓 디스크립터를 등록하고 스레드를 만들어 이 스레드에 인자로 소켓 디스크립터를 전달합니다. 스레드는 해당 클라이언트와 통신을 하고 EPOLLRDHUP(연결 종료) 이벤트가 들어온 소켓 디스크립터에 대해 연결을 해제한다. 이런식으로 구성하려고 합니다. 제가 부족함이 너무 많아서 이런 식의 구성을 사용하지 않는지 잘 모르겠습니다.

익명 사용자의 이미지

저도 그런식으로 구현해봤습니다. 거의 동일한 방식이네요.
한쪽 스레드에서는 sockfd 감시를 하고 실제 sockfd에서 데이터 read는 각 connection별로 스레드를 생성해서 처리하였습니다. 종료되었을 경우 sockfd를 감시하여 EPOLLRDHUP이나 기타 에러 상황일 경우, tid를 기준으로 해당 스레드를 종료시켰습니다.

라스코니의 이미지

연결된 소켓의 이벤트를 감시해서 POLLHUP, POLLERR, POLLNVAL 등이 검출되는지 보시면 됩니다.

HI의 이미지

epoll 을 이용한 멀티플렉싱 + 멀티스레딩을 사용하려고 하시나보네요.
비슷한 구조로 구현해봐서 허접한 답변 드립니다.
우선 다양한 방법이 있을수 있습니다.
몇가지 생각나는 예를들면 말씀하신 방법대로 epoll_ctl()에 EPOLLRDHUP을 등록합니다.
그렇게되면 등록된 client socket이 종료 될경우 event가 발생하여 epoll_wait() 함수를 빠져거고
read 함수의 리턴값을 체크하여 해당 클라이언트 소켓이 종료되었는지 확인합니다.
종료되었을경우 해당 클라이언트 소켓에서 데이터를 읽고 있는 스레드에 pthread_kill 등을 통해 종료시키면 될것 같아요. 그러려면 해당 스레드의 tid를 기준으로 종료해야 될거고 별돌로 epoll 스레드에서는 스레드를 생성할때마다 tid를 관리하고 있어야겠네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.