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 솔루션)

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

main.h (Server)

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

main.cpp (Server)

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

 

main.h (Client)

 

main.cpp (Client)

 

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

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

  1. 안녕하세요?
    귀중한 경험을 공유해 주셔서 감사드립니다.
    너무 초심자라서 다운로드 받은 것을 실행할 수 있을지 궁금합니다.
    VS 2019를 사용하려고 하는데(2013은 설치할 수 없음) 변환하여 메일로 받을 수 있을까요?

    1. 안녕하세요. 2019로 업그레이드한 솔루션도 본문에 첨부해두었습니다. 참고로 2013이 설치되어 있지 않아도 2019로 직접 업그레이드 해서 빌드하고 실행하셔도 됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.