팀프1-2
팀프1
간단한 채팅서버 구현시 오류났던 부분
1. 귀찮더라도 문자열이 아니라 패킷으로 보내야 하는 점.
- 간단한 명령및 통보 문자열을 보낼 때에 패킷헤더를 붙이지 않고 문자열만 통째로 보내는 코드로 작성했었다.
일단 예외처리를 하기가 너무 어려워진다. 예외에는 종류가 많아서 일반 문자열 앞에 Char 형으로 일일이 알려주는 것도 좋지만.
나중에 수정 및 예외처리 추가 시에 중복의 우려 및 명확하게 알려주기가 까다롭다는 것을 알았고 나중에서야 일일이 고쳐주는데
생각보다 많은 시간을 보냈다.
2. 패킷 송신 시 사이즈와 패킷 수신 시 사이즈가 다를 경우 나타나는 현상에 대해 오류가 났었음.
예를 들어 BUF_SIZE = 256 일때
클라이언트가 Send(sock , buf, BUF_SIZE) 를 했다고 치자 만약에 이 상태에서 받는 서버 입장에서 recv(sock, buf , BUF_SIZE/2) 를 하게 되면
수신 버퍼에 있는 데이터의 반만 가져오게 된다. -> 이렇게 되면 클라이언트가 다음에 또 send 를 해줬을 경우
수신버퍼에 남은 절반의 데이터 뒤에 들어온 또 다른 데이터를 붙이는 것을 확인 했다.
3.
UDP 관련해서 UDP 는 에코서버로 할 경우에 여러 개를 킬 수 없다. 컴퓨터에 주어진 IP 가 하나라서 불가능했다.
4.
채팅서버를 만드는 데 다른 사람들의 채팅을 받기 위해서 멀티캐스트로 Client측에서 스레드로 UDP를 사용하는 형태로 코드를 제작했었다.
때문에 종료 시에 Client의 UDP를 실행한 스레드를 종료하기 위해서 UDP 쪽에서 자기 클라이언트의 UDP인지 아닌지 확인이 필요했었다.
(UDP의 멀티캐스트 는 그룹에 속한 모든 Client 에게 메세지를 날리기 때문에 그냥 클라이언트의 구분없이 패킷을 날리다 보니
종료하지 않아야할 Client 가 전부 죽어버렸다)
'시스템프로그래밍' 카테고리의 다른 글
winapi를 통한 Mutex 와 std::recursive_mutex를 통한 동기화 차이 (0) | 2018.11.27 |
---|---|
동적 할당한 CritcalSection 제거시 나타나는 결과 (0) | 2018.07.25 |
이벤트를 사용한 예제 (0) | 2018.05.26 |
뮤텍스와 크리티컬섹션을 이용한 기본 예제 (0) | 2018.05.26 |
크리티컬 섹션과 파일입출력을 통한 기본예제.. (0) | 2018.05.26 |