socketexample

이번 1학기 때 시스템 프로그래밍을 들으면서 소켓 프로그래밍을 배운 적이 있습니다. 대부분의 수업은 리눅스에서 작업했지만 소켓 통신은 윈도우 환경에서도 짜보게 되었는데요, 오늘 업무 중에 간단한 서버 & 클라이언트 프로그램을 짜보라고 하셔서 복습 겸 손풀기 겸 해서 프로그램을 짰습니다.

부탁받은 프로그램은 아래와 같은 행동을 합니다.

서버를 실행하고 클라이언트를 실행한다

클라이언트가 서버에 접속하면 서버는 1초 기다린 다음 클라이언트에게 무작위의 숫자를 하나 보내준다.

클라이언트는 숫자를 받고 1초 기다린 다음 받은 수에 1을 더하고 서버에 보내준다.

서버는 숫자를 받고 1초 기다린 다음 받은 수에 1을 더하고 클라이언트에게 보내준다

위의 두 단계 무한 반복

윈도우 C 혹은 C++ 환경에서 소켓 프로그래밍을 할려면 <WinSock2.h> 헤더를 포함해야 합니다. 그러기 위해선 비주얼 스튜디오에서는 [프로젝트 속성]->[구성 속성]->[링커]->[입력]->[추가 종속성]에 ws2_32.lib를 추가해야 합니다. 또 [프로젝트 속성]->[구성 속성]->[매니페스트 도구]->[입력 및 출력] ->[매니페스트 포함]을 아니요로 바꿔줘야 합니다.

무작위의 수를 뽑아내기 위해 C++11용 <random> 헤더를 이용했구요, 1초 기다리는 부분은 C++11용 <thread> 헤더와 <chrono> 헤더를 이용했습니다.

그리고 소켓에서 주고받을 때는 문자열(char 버퍼)로 주고 받아야 하기 때문에 char 문자열<->string 객체<->int 정수 형태로 형태 교환이 필요해서 C++11용 <string> 헤더를 이용했고 string에서 int로 바꿀 때 예외를 처리하기 위해 <stdexcept> 헤더를 이용했습니다.

SocketExample 다운로드(Visual Studio 2013 솔루션)

main.h (Server)

테스트용이기 때문에 localhost가 대상IP입니다.

main.cpp (Server)

맨 처음에 클라이언트와 통신할 때의 경우를 이용해야 하기 때문에 “HELLO”를 주고받는 형태로 최소한의 프로토콜을 구성했습니다.

 

main.h (Client)

 

main.cpp (Client)

 

나름대로 C++스럽고 구조있게 짤려고 했는데 테스트만 하면 끝이라 그렇게 공을 들이진 않았습니다 헤헤..

One thought on “[C++11] WinSock2.h를 이용한 간단한 윈도우 서버 & 클라이언트 프로그램

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.