멀티 쓰레드 소켓 프로그래밍에 대해 질문이 있습니다.
글쓴이: hongachi7109 / 작성시간: 화, 2020/06/09 - 1:14오전
과제를 하다가 정말 모르겠는 부분이 있어서 질문드립니다.
멀티 쓰레드를 이용해 서버와 클라이언트들이 일대다 통신을 하는 프로그램을 만들어야 하는데요,
조건은 서버 쪽에서는 특정 쓰레드를 지정해서 메세지를 보내거나 모든 쓰레드에 한꺼번에 메세지를 보낼 수 있어야 합니다. 그리고 서버는 특정 쓰레드와 모든 쓰레드를 종료시킬 수 있습니다.
클라이언트와 서버 모두 서로에게 메세지를 보낼 수 있습니다.
궁금한 점은 다음과 같습니다.
1. 쓰레드를 깨울 때 pthread_cond_signal을 이용해 깨워야 하는데, 이 함수로는 특정 쓰레드를 지정할 수 없지 않나요? 원하는 쓰레드만 깨워서 작동시킬 수 있는 방법이 있나요?
2. 서버쪽 프로그램은 계속 클라이언트를 accept하기 위해 while(1)을 돌며 accept로 대기 중인데, 이러한 상황에서 서버가 전체 쓰레드에 메세지를 send할 수 있나요?
제가 생각한 코드는 다음과 같은데요(중요한 부분만 간추려서 작성했습니다)
while(1){ client_fd = accept(listen_fd,(struct sockaddr*)client_addr,&addrlen); pthread_create(&thread_id,NULL,thread_func,(void*)&client_fd); //연결 소켓의 소켓 지정번호로 thread_func로 쓰레드 생성 pthread_detach(thread_id); }
여기서 서버가 전체 클라이언트에 메세지를 보낼려면 main thread에서 broadcast를 이용해 보낼 수 밖에 없을 것 같은데, 정작 서버는 accept를 위해 while을 돌며 대기 상태에 빠지기 때문에 어디서 서버가 전체 클라이언트에 메세지를 보내야 할 지 모르곘습니다.
도움을 주시면 정말 감사하겠습니다.
Forums:
앗 실수로 글이 2개가 올라갔네요;; 글을 지우는
앗 실수로 글이 2개가 올라갔네요;; 글을 지우는 방법을 모르겠는데 어떻게 지우나요?
1. (클라이언트) 쓰레드마다 별도의 시그널을
1. (클라이언트) 쓰레드마다 별도의 시그널을 만드시고 별도의 관리 함수에서 각각 호출하시면 될 겁니다.
2. (서버) 멀티 클라이언트들과 연결하려면 listen(), accept()가 서버에서 별도의 쓰레드로 동작해야 합니다. 그래야 다음번 accept()를 부르면서 대기로 빠지는 것을 막을 수 있습니다.
3. (서버) 클라이언트들과 연결할 때마다 쓰레드로 만들 수도 있지만 이벤트 루프(http://www.cs.tau.ac.il/~eddiea/samples/IOMultiplexing/TCP-multiplex-server.c.html) 방식으로도 구현할 수 있습니다.
댓글 달기