멀티스레드 채팅 프로그램 중 서버 질문이 있습니다

kid1402의 이미지

멀티스레드를 이용해서 다수의 클라이언트를 다루는 채팅 프로그램을 만들고 있습니다
클라이언트쪽도 역시 멀티스레드를 이용해서 워커스레드 하나는 다른 유저의 메세지를 서버로부터 계속 받아와 뿌려주고, 다른 워커 스레드 하나는 해당 클라의 메세지를 서버에 전송하는 형식이구요

서버쪽은 워커스레드가 다수의 클라이언트의 메세지를 받아 접속한 모든 클라에게 뿌려주도록 하고있어요..

지금 하고싶은게 3가지 정도가 있는데 감이 잘 잡히지 않아 질문드립니다. 깨알같은 힌트라도 좋으니 도와주시면 감사하겠습니다 ㅠㅠ

1. 서버의 stdin을 받아 종료하도록 하는 기능
서버에서 워커스레드를 하나 더 만들어서 유저 인풋을 계속 받도록 무한루프를 돌린다음 특정한 종료 메세지 (ex. quit)이 들어오면 접속된 모든 클라이언트의 연결을 끊고 listen 소켓도 닫은 다음 서버 프로그램을 종료시키려고 합니다. 그 외에도 많은 부수적인 기능(접속한 클라이언트를 보여준다더지 하는)을 넣을 수 있을것 같은데 일단 종료 메세지를 받는거 자체가 안되네요..

서버의 클라이언트 핸들링 워커스레드는 pthread_detach()를 이용해서 워커스레드를 메인스레드로부터 분리시켜 동작하게 했구요
유저인풋을 받는 워커스레드는 분리 시킬 필요가 없다고 생각되서 pthread_join()으로 기다리도록 했는데 제 생각이 잘못된것인지 궁금합니다. ㅠㅠ

2. 특정 클라이언트에게 귓속말을 하는 기능
접속한 클라이언트들은 처음 접속할때 채팅 프로그램에서 쓰일 아이디를 입력받도록 했습니다. 채팅 메세지를 뿌릴때 [아이디] : 메시지 형태로 뿌리도록 했구요
이걸 좀더 발전시켜서 특정한 형식의 메시지 (ex. /아이디 메세지)를 클라이언트가 전송하게 되면 서버는 해당 메세지를 파싱해서 그 메세지를 해당 아이디에게만 보내도록 하고싶어요
이 기능은 대체 어떻게 구현해야할지 감이 안옵니다.. 워커스레드를 하나 더 만들어야 할지? 혹은 멀티프로세스 프로그래밍을 이용해야할지?

3. 특정 클라이언트에게 파일을 전송하는 기능
이것도 어찌보면 위의 2번 기능이랑 비슷한 맥락일거라 생각되는데, 우선 가장 궁금한건 TCP로 파일을 전송하려면 어떻게 해야할지가 궁금합니다..
현재 보고 있는 책, 그리고 구글링으로 여러 문서들을 뒤져봤는데 파일을 전송하는 형식이 ftp 와 비슷한 형식으로 하는것 같더라구요
제가 생각할 때는 클라가 특정 클라에게 파일을 전송하려고 하면, 서버는 파일 전송을 요청한 클라에게 해당 클라의 IP 주소를 보내주고, 그 클라는 그 IP 주소로 다시 소켓을 열어서 파일을 전송하면 될것 같은데... 이미 서버와 소켓으로 통신하고 있는 도중에 다른 소켓을 열어 또다른 클라 혹은 서버와 통신하는게 가능한가요?

질문이 좀 많지만 하나라도 작은 힌트라도 주시면 정말 감사하겠습니다. ㅠㅠ

shint의 이미지

S 를 서버. A와 B를 클라이언트'라고 할때
A -> S -> B 로 전송한다고 하면.
S가 A의 파일'을 받아서 B에게 전송량을 체크하며. 전송하거나.
B가 A에게 접속해서 전송하거나
A가 B에게 접속해서 전송 가능합니다.
공유기를 사용할 경우. 포트포워딩. DMZ. 설정이 되어있어야 하거나.
UPNP로 임시로 포트'를 열어서 전송량'을 체크하며 전송해도 됩니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

kid1402의 이미지

클라이언트가 소켓으로 서버와 접속한 상태에서
소켓을 하나 더 열어서 다른 클라이언트와 통신하는게 가능한가요??

그리고 말씀하신방법중에 A, B끼리 전송하는 방법을 보면 결국 한쪽이 (아마 파일을 제공하는 쪽이) 서버로 동작할것 같은데
클라이언트가 소켓으로 서버와 통신하는 상태에서, 그 자신이 서버가 되는 소켓을 하나 더 열어서 다른 클라이언트와 통신하는게 가능할까요??

질문이 점점 복잡해지는기분이 ㅠㅠ

shint의 이미지

둘다 가능합니다.
서버에서 소켓을 열경우 파일 전송'을 한다면 서버부하가 크게 되니 어렵습니다.
그래서 직접 전송하기위해 upnp는 편리합니다.
대신 upnp는 공유기에서 체크'해주셔야 합니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

declspec의 이미지

공유기환경에서upnp로포트개방하는프로그램을개발하고싶은데 무슨라이브러리가있나요? 포트개방을위한upnp프로토콜이어떻게되는지궁금합니다 구글링해도없어요ㅠ

자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.

shint의 이미지

여기 문서에서 보시면 xml처럼 보이는 부분에 프로토콜'을 전송해주시는겁니다.
물론. 공유기에서 제공해줘야 합니다.
http://onecellboy.tistory.com/2

쉬운 설명
http://kjk1245.blog.me/110106392358

upnp가 구현된 소스
upnp는 프로토콜'입니다. 이 소스를 잘 보신후 xml한줄 던지면 포트가 열리는구나. 하고 알게 되실겁니다.
http://www.codeproject.com/KB/IP/PortForward.aspx

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

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