멀티 쓰레드 소켓 프로그래밍에 대해 질문이 있습니다.

hongachi7109의 이미지

과제를 하다가 정말 모르겠는 부분이 있어서 질문드립니다.
멀티 쓰레드를 이용해 서버와 클라이언트들이 일대다 통신을 하는 프로그램을 만들어야 하는데요,
조건은 서버 쪽에서는 특정 쓰레드를 지정해서 메세지를 보내거나 모든 쓰레드에 한꺼번에 메세지를 보낼 수 있어야 합니다. 그리고 서버는 특정 쓰레드와 모든 쓰레드를 종료시킬 수 있습니다.
클라이언트와 서버 모두 서로에게 메세지를 보낼 수 있습니다.

궁금한 점은 다음과 같습니다.

1. 쓰레드를 깨울 때 pthread_cond_signal을 이용해 깨워야 하는데, 이 함수로는 특정 쓰레드를 지정할 수 없지 않나요? 원하는 쓰레드만 깨워서 작동시킬 수 있는 방법이 있나요?

2. 서버쪽 프로그램은 계속 클라이언트를 accept하기 위해 while(1)을 돌며 accept로 대기 중인데, 이러한 상황에서 서버가 전체 쓰레드에 메세지를 send할 수 있나요?

제가 생각한 코드는 다음과 같은데요(중요한 부분만 간추려서 작성했습니다)

while(1){
   client_fd = accept(listen_fd,(struct sockaddr*)client_addr,&addrlen);
   pthread_create(&thread_id,NULL,thread_func,(void*)&client_fd); //연결 소켓의 소켓 지정번호로 thread_func로 쓰레드 생성
   pthread_detach(thread_id);
}

여기서 서버가 전체 클라이언트에 메세지를 보낼려면 main thread에서 broadcast를 이용해 보낼 수 밖에 없을 것 같은데, 정작 서버는 accept를 위해 while을 돌며 대기 상태에 빠지기 때문에 어디서 서버가 전체 클라이언트에 메세지를 보내야 할 지 모르곘습니다.

도움을 주시면 정말 감사하겠습니다.

hongachi7109의 이미지

앗 실수로 글이 2개가 올라갔네요;; 글을 지우는 방법을 모르겠는데 어떻게 지우나요?

라스코니의 이미지

1. (클라이언트) 쓰레드마다 별도의 시그널을 만드시고 별도의 관리 함수에서 각각 호출하시면 될 겁니다.

2. (서버) 멀티 클라이언트들과 연결하려면 listen(), accept()가 서버에서 별도의 쓰레드로 동작해야 합니다. 그래야 다음번 accept()를 부르면서 대기로 빠지는 것을 막을 수 있습니다.

3. (서버) 클라이언트들과 연결할 때마다 쓰레드로 만들 수도 있지만 이벤트 루프(http://www.cs.tau.ac.il/~eddiea/samples/IOMultiplexing/TCP-multiplex-server.c.html) 방식으로도 구현할 수 있습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.