select + thread 를 동시에 사용하려면....

ningoi의 이미지

요즘 한창 TCP/IP에 대해 공부하고 있는 초보자입니다.
(이곳 KLDP에는 처음이구요..)
예전에는 C#으로만 하다가.
이번에 첨으로 리눅스에 맛을 드려서 리눅스용으로 간단한 채팅 C/S를 구현해 보려고 합니다.
그런데..
I/O멀티 플렉싱을 하려고 하는데 select()함수를 이용해서 구현은 했는데..
스레드를 적용시켜보고 싶어서 이리저리 연구 하고 있는데 잘 안되는군요...
우선 대략적인 흐름도..
.
.
.
select()함수 생성..

for(fd=0; fd<fd_max+1; fd++)
{
if(FD_ISSET(fd, &temps))
{
if(서버소켓 == fd)
{
//연결부분..
클라이언트 소켓 = acceopt()...
FD_SET(클라이언트 소켓, &reads);
}
else
{
//실제 데이터 전송부분..
char * buf = new char[1024];

이부분에서 pThread생성

}
...

}
저 윗부분에서 buf를 ptread생성시 매개변수로 넘겨줍니다.
그런데 이렇게 하면.
서버가 잘 실행되긴하는데...
로그를 확인해 보면.
빈 패킷을 날아가더군요......
저 방식이 무리가 있는듯 싶은것 같구요..
혹시 pthread와 select를 함께쓸때..
가장 많이 쓰는 방식이 어떤걸까요?
아시는 분있으시면 답변 부탁 드리겠습니다.

p.s:이곳 글을 select로 검색해 보고 48page를 전부 하나하나 다 ~ 둘러본 결과 이렇게 글을 올립니다.

peccavi의 이미지

마지막줄이 인상깊어 없는 실력이지만 도움이 될까 해서 글 답니다.
빈 패킷이 날아간 이유는 코드상의 오류 같아 보이구요,
우선은 생성한 스레드가 어떤 역할을 하는지 확실히 해두어야 합니다.
보여주신 코드에서는 이 스레드가 어떤 역할을 하는지 알기 힘들구요
그에 따라서 스레드가 생성되는 시점도 잘못되었다고 볼 수 있겠네요..

일반적으로 쓰이는 select+thread 구조는..

1. 소켓을 accept하고 메세지를 recv하는 스레드
2. (1)번 스레드에서 recv한 패킷을 처리하는 스레드
3. 생성된 패킷을 send하는 스레드
4. 기타 스레드(타이머 등등..)

예를 들면요,
1번 스레드에서 select로 소켓을 처리하고
패킷이 오면 리시브 큐에 집어 넣습니다.
2번 스레드에서는 항상 리시브 큐를 검사해서 새 메세지가 오면 처리하는거죠..
처리 과정에서 소켓에 send할 일이 생기면
샌드 큐에 메세지를 집어 넣어서 3번 스레드가 이 큐를 검사해 새 메세지가
있으면 send 하는거구요..
아주 오래된 방식입니다만 아직도 많이 쓰시는걸로 알고 있습니다.

아, 그리구요, 여기 찾아보시면 서버 구조에 대한 글이 상당히 많이 있습니다.
저도 아직 배우는 수준이라 뭐라 말씀드리기 부끄럽구요,
좀 더 찾아 보세요~

----
jai guru deva om...

댓글 달기

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