recv()를 사용하는 쓰레드를 종료시키려면 어떻게 해야하나요?

iamsjkim의 이미지

간단한 프로토콜을 설계중에 있습니다. 문제는 제가 프로그래밍 자체에 초보라는 점입니다ㅜ_ㅜ

코딩하려는 내용은 다음과 같습니다.

(server측)
소켓을 열고 bind, listen, accept해서 client A와 연결이 되었다고 가정하고
A로부터 Msg를 받습니다. 일단 이에대한 Ack를 만들어 전송한 후 수신된 Msg로 Func1()을 실행합니다.
Func1()실행 직전에 pthread_create()로 쓰레드 Rx를 만들어서, 메인 쓰레드가 Func1()을 실행하는 동안 Client A로부터 재전송되어 오는 Msg에 대한 Ack 처리를 담당하게 하려고 합니다.(server가 보낸 Ack를 Client A가 수신하지 못했을 경우 A의 재전송 메세지에 대비하기위해 쓰레드를 생성한것입니다.)
그렇기에 Rx는 일단 recv()라는 소켓함수를 쓰도록 할셈입니다.
여기에서 문제가 발생했는데요,
Client A로부터 Msg가 재전송되어오지 않을 경우 Rx 쓰레드의 recv()함수는 마냥 데이타가 오기만을 기다리기만 할텐데, 그러면 Rx쓰레드는 recv() 함수가 메세지를 받지않는한 return도 안할테고 종료도 안될테니 어떻게 안전하게 Server와 Client A 간의 connection을 종료시킬지 난감합니다. -_-

참, 그리고 제가 이 문제해결을 좀 해보고자 여기저기 검색하다보니 user-level의 쓰레드와 kernel-level쓰레드가 있어서 user-level쓰레드의 경우, 한 쓰레드가 blocking function을 쓰면 다른 모든 쓰레드까지 다 블록된다는 글을 읽었습니다. @.@ 저같은 경우 이런일이 절대 생기면 안되기에..
recv()함수가 블로킹 함수인지도 잘 모르겠고..ㅜ.ㅜ

C 프로그램도 거의 짜본적이 없던 초보가 소켓에 쓰레드까지 공부해서 코딩하려니 장벽이 보통 많은게 아니더군요..T.T

부디 도움말씀 부탁드리겠습니다.

byung82의 이미지

서버 측과 같이 여러사용자가 물여서 동작할경우 비동시 소켓으로 많이 사용합니다.

동기시 한쪽에서 데이타가 오지 않으면 블럭이 되기 때문에 통신상에 문제가 발생했을때 여러가지 문재를 발생 시킵니다.
일단 아래에 적은것을 찾아서 참조하시기 바랍니다.
아 그리고 W. Richard Stevens 이 저술하신 Unix Network Programming 책도 참조하시기 바랍니다.

공통적으로 select/poll 을 한번 참조하시고 여기 게시판에 찾기로 해도 많은 정
보를 얻을 수있습니다.

linux면 저기에 epoll을 더 선택할수 있고
FreeBSD면 kqueue도 선택할수 있습니다.

myroot의 이미지

Quote:
server가 보낸 Ack를 Client A가 수신하지 못했을 경우 A의 재전송 메세지에 대비하기위해 쓰레드를 생성한것입니다.)

과연 이게 필요할까요? tcp를 사용하신다면 tcp프로토로콜에서 알아서 해주는 기능인데요...?

iamsjkim의 이미지

일단 TCP소켓으로 코딩하고있지만 RS-232 용으로 또 짜야하고
ACK종류도 좀 여러개 만들 필요가 있어서 ACK까지 생각하게 되었습니다..T.T

답변 말씀들 감사드립니다.

일단 select/poll을 찾아봐야겠네요.
비동기 소켓.. 흠...T.T
어렵네요. 흑~

댓글 달기

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