Coding & Programming/Network(TCP, IP, UDP)

[C/C++] 윈도우 소켓(Winsock) 1:N 채팅/통신 프로그램 구현하기#1:: 소개

mainCodes 2021. 4. 15. 14:55

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و

인터넷이 일반화되어 있는 요즘은 카카오톡, 웹브라우저 등 대부분의 프로그램들이 네트워크 통신 기능을 기본적으로 제공하고 있습니다. 그래서 이번에는 윈속(Winsock)을 이용한 네트워크 통신 프로그램 구현 방법에 대해 스터디한 글을 짧은 연재로 기록합니다. 

윈도우, 리눅스 등의 운영체제에서 네트워크 통신 프로그램 개발할 수 있는데요. 기본적으로 소켓(socket) 라이브러리를 통해 프로그램을 개발할 수 있습니다. sqrt(), pow(), abs(), fabs() 등과 같은 수학 관련 라이브러리를 사용하듯이 네트워크 프로그래밍을 하려면 socket(), bind(), accept(), send(), recv() 등과 같은 소켓 관련 함수를 사용합니다.

윈도우에서 네트워크 프로그래밍을 하려면 윈속 관련 함수들이 정의되어 있는 winsock2.h 헤더를 포함해야 합니다. 기본적인 소켓 관련 함수들의 원형과 기능은 운영체제 별로 유사하지만 운영체제의 특성에 따라 조금씩 차이가 있을 수 있으며 윈속의 WSAXXX 함수군과 같이 윈도우 운영체제 환경에 맞는 추가적인 라이브러리를 사용하면 더 쉽게 통신 기능을 구현할 수 있습니다.

이번에 만들어 보고자하는 프로그램은 윈도우 소켓을 이용한 1:N 채팅 프로그램으로, 직접 구현해봄으로써 네트워크 통신의 원리를 이해하는 것이 목표랍니다. 다음은 채팅 프로그램 구현에 주로 사용되는 소켓 함수들을 정리한 내용입니다.

■ 채팅 서버에서 주로 사용하는 함수군

WSAStartup() Winsock 초기화 함수로 윈도우 환경에서 제일 처음 사용해야 하는 함수
socket() 네트워크 통신을 위해 소켓을 생성하는 함수
bind() 로컬 네트워크 주소를 소켓과 결합하는 함수
listen()  연결 요청 대기 상태로 소켓을 설정하는 함수
accept() 연결 요청을 허용해주는 함수
WSACreateEvent() 이벤트 객체를 생성하는 함수
WSAEventSelect() FD_READ, FD_CLOSE 등 소켓의 네트워크 이벤트와 객체를 결합하는 함수
WSAWaitForMultipleEvents()  이벤트 객체들의 소켓 상태를 감지하는 함수
WSAEnumNetworkEvents() 네트워크 이벤트가 발생한 소켓에서 이벤트 종류를 리턴하는 함수
recv()  소켓에 데이터를 전송하는 함수
closesocket() 사용이 끝난 소켓을 닫는 함수
WSACloseEvent() 사용이 끝나 열린 객체 핸들을 닫는 함수
WSACleanup() Winsock2 DLL(ws2_32.dll) 사용을 종료하는 함수

 

클라이언트에서 주로 사용하는 함수군(서버와 일부 중복)

WSAStartup() Winsock 초기화 함수로 윈도우 환경에서 제일 처음 사용해야 하는 함수
socket() 네트워크 통신을 위해 소켓을 생성하는 함수
connect() 소켓 연결 요청 함수
recv() 소켓으로부터 데이터를 수신하는 함수
send() 소켓에 데이터를 전송하는 함수
closesocket() 사용이 끝난 소켓을 닫는 함수
WSACleanup()  Winsock2 DLL(ws2_32.dll) 사용을 종료하는 함수

 

윈속 함수에 따른 프로그램 기본 개념도

 

윈속 함수 중 WSAXXX로 시작하는 함수들은 윈도우 운영체제 환경에서 이벤트 객체를 생성하고 네트워크 이벤트와 소켓을 결합하며 소켓상에서 FD_ACCEPT, FD_READ, FD_WRITE, FD_CLOSE와 같은 이벤트가 발생했는지 등을 판단하는 용도로 사용됩니다. 이 부분은 다음에 예제로 정리하도록 하겠습니다.

윈속(Winsock)에는 위에서 언급한 함수 외에도 다양한 함수가 있으니 마이스크로소프트(Microsoft) 홈페이지를 참고하세요. 개인적으로 마스크로소프트에서 제공하는 Programming reference for the Win32 API 레퍼런스를 추천합니다.

 

다음 번에는 채팅 프로그램의 기본 구조와 Visual Studio 2019 환경에서 Winsock 라이브러리 설정 방법에 대해 기록할 예정입니다.

이상 JollyTree였습니다 (•̀ᴗ•́)و