컴퓨터 네트워크 과목의 파이널 과제로 나온 '소켓 통신으로 채팅 서버 구현하기'를 시작했다.
이전 과제에서 사용했던 웹서버 코드를 재활용하는 중이다. 많이 사용하지는 않고, 소켓 구현과 바인딩, listen 정도만 공유하는 중이다.
client단을 짜는건 간단할 줄 알았는데, 하면 할수록 더 해야할 일이 늘어나는 기분이다.
오늘 배운 것 중 가장 기억에 남는 것은 프로토콜의 사용이다.
내가 가졌던 의문은
"처음에 client가 server에 자신이 들어가고자 하는 방 번호와 닉네임(Bob 이라고 가정)을 알려준다고 할때, server는 어떻게 client가 닉네임을 Bob으로 하고싶어하는지 아니면 그저 Bob이라는 메세지를 전송하고 싶어하는지를 구분할까?"
였는데, 이걸 해결하는 법이 프로토콜의 사용이었다. Message의 struct를 만든 다음에 그 안에 메세지의 타입을 정하는 int 변수를 넣고, 이 메세지가 서버에 설정을 전달하는 메세지인지, 아니면 client가 실제로 채팅방에 print 하고싶어하는 메세지 인지를 구분하게 하는 것이다.
그리고 client단에서 서버와의 통신을 열어놓고 서버로부터 오는 packet을 recv 해야하는데, 동시에 키보드에서 입력되는 문장을 받아서 send 도 해야 한다. 이때 그냥 gets(), send(), recv()를 순서대로 while(1)에서 하게 되면 gets()가 실행되는 동안 recv()는 실행되지 않는다. 이 문제를 해결하기 위해 pthread를 사용했다. 키보드 input을 pthread function으로 계속 받게 하고, main thread가 recv를 받게 하는 식이다.
이제 해야할 일은 서버가 client에게 채팅방 입장을 알린 후에 메세지를 전송하고 받게 하는법과 디버깅이다. 디버깅이 끝나면 기본 점수를 다 받게 된다. 그 뒤에 추가점수를 노려야 할 것 같다. 오늘은 여기까지
댓글
댓글 쓰기