select + thread 를 동시에 사용하려면....
요즘 한창 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를 전부 하나하나 다 ~ 둘러본 결과 이렇게 글을 올립니다.
...
마지막줄이 인상깊어 없는 실력이지만 도움이 될까 해서 글 답니다.
빈 패킷이 날아간 이유는 코드상의 오류 같아 보이구요,
우선은 생성한 스레드가 어떤 역할을 하는지 확실히 해두어야 합니다.
보여주신 코드에서는 이 스레드가 어떤 역할을 하는지 알기 힘들구요
그에 따라서 스레드가 생성되는 시점도 잘못되었다고 볼 수 있겠네요..
일반적으로 쓰이는 select+thread 구조는..
1. 소켓을 accept하고 메세지를 recv하는 스레드
2. (1)번 스레드에서 recv한 패킷을 처리하는 스레드
3. 생성된 패킷을 send하는 스레드
4. 기타 스레드(타이머 등등..)
예를 들면요,
1번 스레드에서 select로 소켓을 처리하고
패킷이 오면 리시브 큐에 집어 넣습니다.
2번 스레드에서는 항상 리시브 큐를 검사해서 새 메세지가 오면 처리하는거죠..
처리 과정에서 소켓에 send할 일이 생기면
샌드 큐에 메세지를 집어 넣어서 3번 스레드가 이 큐를 검사해 새 메세지가
있으면 send 하는거구요..
아주 오래된 방식입니다만 아직도 많이 쓰시는걸로 알고 있습니다.
아, 그리구요, 여기 찾아보시면 서버 구조에 대한 글이 상당히 많이 있습니다.
저도 아직 배우는 수준이라 뭐라 말씀드리기 부끄럽구요,
좀 더 찾아 보세요~
----
jai guru deva om...
댓글 달기