2017-12-11 22 views
1

나는 클라이언트가 채팅 할 수있게 해주는 매우 기본적인 C 서버를 구현 중이다. 지금은 fork()를 사용하고 있지만 클라이언트가 서로의 메시지를 보도록하는 데 어려움을 겪고 있습니다.포크 기반 서버에서 클라이언트 - 클라이언트 통신이 가능합니까?

또한 모든 클라이언트가 accept()에서 동일한 파일 설명자를 얻는 것으로 보입니다. 기본적으로 누군가가 select(), accept(), connection() 및 fork()를 사용하여 연결하려는 경우 while 루프를 테스트합니다. 그 후 필자는 입력을 읽고 모든 사용자 (목록에있는 사용자)에게 전달하려고합니다. 필요한 경우 코드를 복사/붙여 넣을 수 있습니다.

클라이언트가 프로세스와 통신하도록 할 수 있습니까, 아니면 pthread를 사용해야합니까?

답변

2

Inter-process communication -IPC- (일반적으로) 클라이언트와 서버는 상관하지 않습니다 (connect 단계 제외). 주어진 프로세스는 (다른 소켓에) 클라이언트와 서버 역할을 둘 다 가질 수 있으며, event loop의 여러 소켓에 poll(2) 또는 구형 select을 사용합니다.

공지 사항 processesvirtual address space 각각 자신을 가지고 threads주 동안 같은 가상 주소 공간 (자신 포함하는 프로세스의 하나). pthread tutorial과 POSIX 프로그래밍에 관한 책 (아마도 오래된 ALP)을 읽어보십시오. 프로세스에 관한 많은 정보는 리눅스에서 /proc/을 통해 쿼리 할 수 ​​있습니다 (자세한 내용은 proc(5) 참조). 특히, PID 1234 프로세스의 가상 주소 공간이 /proc/1234/maps를 통해 획득 할 수 /proc/1234/fd//proc/1234/fdinfo/ 등을 통해 자사의 오픈 파일 기술자 ....

그러나, 일반적인 서버가 공유 상태를 유지 코딩 간단하다, 메시지를 클라이언트에 발송

클라이언트가 해당 IPC를 시작할 수있는 방법이있는 프로토콜을 설계 할 수 있습니다. 예를 들어 모든 프로세스가 동일한 시스템에있는 경우 unix(7) 소켓 주소 또는 fifo(7)으로 사용되는 파일 경로를 전송하는 프로토콜을 가질 수 있으며 각 "클라이언트"프로세스는 나중에 (일부는 connect과 함께) 직접 통신을 시작합니다 또 다른 "클라이언트". 그렇게하는 것은 현명하지 않을 수 있습니다.

0mq과 같은 라이브러리를 살펴보십시오. 그들은 종종 free software이며, 그래서 당신은 그들의 소스 코드를 연구 할 수 있습니다.

+0

그래, 나는 이미 서버에있는 모든 클라이언트의 목록을 가지고있는 동안 직접 클라이언트 - 클라이언트 통신의 아이디어를 좋아하지 않는다. 내 생각에 pthreads는 ... – Novice

+0

아니요, pthreads는 공통 가상 주소 공간을 공유합니다. –

+0

pthreads로 처리 할 수 ​​있음을 알고 있지만 가능한 경우 프로세스에서도 궁금합니다. 그것은 단지 로컬 채팅 서버입니다. – Novice