From ba8cb7b6a9a2d2446f0d21653c41df71ec2837d6 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 18 Mar 2020 09:56:40 +0900 Subject: [PATCH] client.c, server.c --- SimpleChatting/client.c | 19 +++++++++++-------- SimpleChatting/server.c | 3 ++- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/SimpleChatting/client.c b/SimpleChatting/client.c index 0d4206d..50383ca 100644 --- a/SimpleChatting/client.c +++ b/SimpleChatting/client.c @@ -24,7 +24,7 @@ typedef struct msgBuf void ConnectSharedMemory(); // 공유메모리에 현재 프로세스 정보 저장 -void WriteCurrentProcess(void **pShemBuffer, char *name); +void WriteCurrentProcess(char *name); // 메시지 큐를 생성 혹은 연결 void CreateOrConnectMessageQueue(); @@ -72,7 +72,7 @@ int isChattingPossible = FALSE; int main(int argc, char *argv[]) { - if(argc != 2) + if(2 != argc) { printf("you must input one argument\n"); exit(1); @@ -90,7 +90,7 @@ int main(int argc, char *argv[]) ConnectSemaphore(); - WriteCurrentProcess(&pShemBuffer, argv[1]); + WriteCurrentProcess(argv[1]); CreateOrConnectMessageQueue(); @@ -167,10 +167,10 @@ void ConnectSharedMemory() } // 현재 프로세스 데이터를 공유메모리에 저장 -void WriteCurrentProcess(void **pShemBuffer, char *processName) +void WriteCurrentProcess(char *processName) { int i; - SharedData *pSharedData = ((SharedData*)*pShemBuffer); + SharedData *pSharedData = (SharedData*)pShemBuffer; if(NULL == pSharedData) { @@ -183,7 +183,7 @@ void WriteCurrentProcess(void **pShemBuffer, char *processName) } // 현재 접속 수를 조사하여 예외처리 - if(pSharedData->numOfProcess == 2) + if(2 == pSharedData->numOfProcess) { printf("process is full in server\n"); @@ -201,7 +201,8 @@ void WriteCurrentProcess(void **pShemBuffer, char *processName) exit(1); } } - + + // 동시에 클라이언트가 접근할 수 있으므로 세마포어로 1개의 클라이언트 씩 공유메모리에 접근하여 수정 Semaphore_Lock(); // 접속 순서대로 차례대로 프로세스 데이터를 공유메모리에 저장 @@ -242,7 +243,9 @@ void SendMessage(char *name) memset(&buf, 0, sizeof(buf)); strcpy(buf.name, name); - buf.msgType = getpid(); + + // 메시지를 보낼 때 메시지 타입을 자신의 pid로 지정하여 보냄 + buf.msgType = getpid(); while(isChattingPossible && NULL != fgets(buf.text, sizeof(buf.text), stdin)) { diff --git a/SimpleChatting/server.c b/SimpleChatting/server.c index bb12356..9fa2dbc 100644 --- a/SimpleChatting/server.c +++ b/SimpleChatting/server.c @@ -132,7 +132,8 @@ void SIGINT_Handler(int signo) for(i = pSharedData->numOfProcess -1; i >= 0; i--) { kill(pSharedData->pData[i].pid, SIGINT); - sleep(1); // 1초 Sleep하는 이유는 클라이언트가 접속 종료했다는 정보를 제대로 표시하기위해서 + sleep(1); // 1초 Sleep하는 이유는 2명의 클라이언트가 동시 종료할경우 SIGSUR2 시그널이 거의 동시에 발생하기때문에 + // 한 유저의 이름만 2번 접속 종료됬다는 메시지가 출력되기때문 } } -- GitLab