728x90
쓰레드의 소멸
- 쓰레드에 할당한 함수가 끝났다고 해서 완전히 소멸한 것이 아님
- pthread_join 함수나 pthread_detach 함수를 호출해서 소멸을 시켜줘야 함
- pthread_join은 함수가 끝날 떄 까지 대기하는 함수
- pthread_detach : 종료와 동시에 소멸을 시킴
#include <pthread.h>
int pthread_detach(pthread_t thread);
멀티 쓰레드 기반의 다중 접속 서버
void * handle_clnt(void * arg);
void send_msg(char * msg, int len);
void error_handling(char * msg);
int clnt_cnt=0;
int clnt_socks[MAX_CLNT]; // 클라이언트 소켓들
pthread_mutex_t mutx;
int main(int argc, char *argv[])
{
int serv_sock, clnt_sock;
struct sockaddr_in serv_adr, clnt_adr;
int clnt_adr_sz;
pthread_t t_id;
pthread_mutex_init(&mutx, NULL); // 뮤텍스 생성
serv_sock=socket(PF_INET, SOCK_STREAM, 0); // 서버 소켓 생성
if(bind(serv_sock, (struct sockaddr*) &serv_adr, sizeof(serv_adr))==-1)
printf("bind() error");
if(listen(serv_sock, 5)==-1)
printf("listen() error");
while(1)
{
clnt_adr_sz=sizeof(clnt_adr);
clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr,&clnt_adr_sz);
pthread_mutex_lock(&mutx); // lock
clnt_socks[clnt_cnt++]=clnt_sock;
pthread_mutex_unlock(&mutx); // unlock
pthread_create(&t_id, NULL, handle_clnt, (void*)&clnt_sock); // 소켓 정보들을 넘겨줌
pthread_detach(t_id); // 쓰레드 종료 시 소멸 시킴
printf("Connected client IP: %s \n", inet_ntoa(clnt_adr.sin_addr));
}
close(serv_sock);
return 0;
}
void * handle_clnt(void * arg)
{
int clnt_sock=*((int*)arg);
int str_len=0, i;
char msg[BUF_SIZE];
while((str_len=read(clnt_sock, msg, sizeof(msg)))!=0) // 데이터를 읽어서
send_msg(msg, str_len); // 모든 클라이언트들에게 send 해줌
pthread_mutex_lock(&mutx);
for(i=0; i<clnt_cnt; i++) // remove disconnected client
{
if(clnt_sock==clnt_socks[i])
{
while(i++<clnt_cnt-1)
clnt_socks[i]=clnt_socks[i+1];
break;
}
} // 종료 시 소켓 목록에서 삭제
clnt_cnt--;
pthread_mutex_unlock(&mutx);
close(clnt_sock); // 소멸
return NULL;
}
void send_msg(char * msg, int len) // send to all
{
int i;
pthread_mutex_lock(&mutx);
for(i=0; i<clnt_cnt; i++)
write(clnt_socks[i], msg, len); // 모든 클라이언트들에게 send 해줌
pthread_mutex_unlock(&mutx);
}
728x90
'Programming > Network' 카테고리의 다른 글
열혈 TCP/IP 19-2. 윈도우 기반의 쓰레드 생성 (0) | 2021.04.11 |
---|---|
열혈 TCP/IP 19-1. 커널오브젝트(Kernel Objects) (0) | 2021.04.11 |
열혈 TCP/IP 18-4. 쓰레드 동기화 (0) | 2021.03.28 |
열혈 TCP/IP 18-3. 쓰레드의 문제점과 임계영역(Critical Section) (0) | 2021.03.28 |
열혈 TCP/IP 18-2. 쓰레드의 생성 및 실행 (0) | 2021.03.28 |