recv()를 사용하는 쓰레드를 종료시키려면 어떻게 해야하나요?
간단한 프로토콜을 설계중에 있습니다. 문제는 제가 프로그래밍 자체에 초보라는 점입니다ㅜ_ㅜ
코딩하려는 내용은 다음과 같습니다.
(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
부디 도움말씀 부탁드리겠습니다.
참조
서버 측과 같이 여러사용자가 물여서 동작할경우 비동시 소켓으로 많이 사용합니다.
동기시 한쪽에서 데이타가 오지 않으면 블럭이 되기 때문에 통신상에 문제가 발생했을때 여러가지 문재를 발생 시킵니다.
일단 아래에 적은것을 찾아서 참조하시기 바랍니다.
아 그리고 W. Richard Stevens 이 저술하신 Unix Network Programming 책도 참조하시기 바랍니다.
공통적으로 select/poll 을 한번 참조하시고 여기 게시판에 찾기로 해도 많은 정
보를 얻을 수있습니다.
linux면 저기에 epoll을 더 선택할수 있고
FreeBSD면 kqueue도 선택할수 있습니다.
과연 필요할까요?
과연 이게 필요할까요? tcp를 사용하신다면 tcp프로토로콜에서 알아서 해주는 기능인데요...?
일단 TCP에서 돌아가게는 해야하지만..
일단 TCP소켓으로 코딩하고있지만 RS-232 용으로 또 짜야하고
ACK종류도 좀 여러개 만들 필요가 있어서 ACK까지 생각하게 되었습니다..T.T
답변 말씀들 감사드립니다.
일단 select/poll을 찾아봐야겠네요.
비동기 소켓.. 흠...T.T
어렵네요. 흑~
댓글 달기