Qt6기반 소켓프로그래밍 (채팅앱)

들어가며

2020년쯤에 작성된 "MFC 기반 소켓 프로그래밍" 예제가 있습니다. 

간단히 만든 프로토콜을 활용해 채팅, 이미지, 파일 등의 전송이 가능하게 만든 예제인데 조회수가 1만5천회 정도로 학원 블로그 게시물중 높은 편입니다.

아직도 MFC 사용자가 이렇게 많다는 사실에 많이 놀랐습니다.😮

과거 저도 MFC로 C++ GUI를 많이 개발해 왔지만 이제는, 사실 15~20년 쯤 전부터  더 이상 업데이트도, 크로스 플랫폼도 지원되지 않는 구시대의 유물이 아닌가 하는 개인적인 생각입니다. 

출처: MS Bing Image Creator
 

요즘은 Windows, Mac 과 더불어 Android, iOS 등 모바일 플랫폼에 대응하기 위해 C++은 Qt로, Python은 PyQt로 GUI 를 구성해 가고 있습니다.

하지만 점점 높아져가는 사용자의 눈높이와 Front, Back End 구분없이 잘하고 싶은 마음에 Dart + Flutter 도 적극 활용하고 있습니다.

Flutter 짱~ 🤣

적다보니 쓸데없는 말이 많아 졌습니다. MFC 빨리 탈출하세요~


Winsock2.h의 문제점

오랜만에 Winsock2를 이용해 앱을 만들려고 하니 불편한 점이 참 많이 느껴집니다.😫

GPT와 상의해 한번 정리해 보았습니다.

플랫폼 종속성

winsock2.h는 Windows 플랫폼에 종속적입니다. 이로 인해 이 헤더를 사용하는 코드는 Windows에서만 작동하며, 다른 운영 체제에서는 작동하지 않습니다. 따라서, 멀티 플랫폼을 지원해야 하는 경우에는 코드의 호환성을 유지하기 위해 추가적인 작업이 필요합니다.

비표준화된 API

WinSock API는 BSD 소켓 API와 유사하지만, 표준 BSD 소켓 API와 일부 차이점이 있어 코드를 다른 플랫폼으로 이식할 때 문제가 될 수 있습니다. 예를 들어, WinSock은 소켓 함수의 반환 값으로 SOCKET_ERROR를 사용하며, 일부 함수 호출 후에 WSAGetLastError()를 사용하여 오류 코드를 확인해야 합니다.

뭔넘의 구조체는 이리도 많은지...😩

멀티스레딩 문제

winsock2.h는 멀티스레딩 환경에서 사용할 때 주의가 필요합니다. 일부 WinSock 함수는 스레드에 안전하지 않을 수 있으므로, 소켓과 관련된 작업을 수행할 때 동기화 메커니즘을 적절히 사용해야 합니다.

그 외 느린 개발 속도, IPv6 지원 부족, 종속성 및 버전 관리 문제 등 정말 손이 많이 갑니다.

OS의 저수준 API를 공부해서 나쁠것은 없지만 그 OS가 다양해 깊게만 들어가기는 지식습득의  한계가 느껴집니다.

 

Qt6 Socket Class 활용

남이 만든 Wrapper 클래스의 사용을 쉬운길만 간다며 혐오하던 제가 이번에는 Qt의 Socket Class를 활용해 채팅앱을 만들어 봤습니다.

결론은 너무 쉽고 좋네요.🤣

가장 행복한 부분은 별다른 수정없이 다른 플랫폼에도 적용가능하다는 사실입니다.

처음 QTcpServer, QTcpSocket 을 사용해 앱을 만들어봤는데 2~3시간이면 충분합니다. 그것도 서버, 클라이언트 둘 다 만드는 것을 포함해서 말이죠.

 

개발환경

  • Windows 11 Pro, Qt Creator 14.0.1
  • C++ Qt 6.7.2 MSVC Compiler, qmake

 

참조 문헌 (Qt Doc.)

https://doc.qt.io/qt-6/qtcpserver.html

https://doc.qt.io/qt-6/qabstractsocket.html

 

소스코드

Git Link : 채팅서버 소스코드

Git Link : 채팅클라이언트  소스코드

 

서버 실행 화면입니다.


클라이언트 실행화면


Android에 배포하는 방법이 궁금하다면 이 게시물을 참조하고,

이것도 옛날 것 같은 느낌이 든다면 Flutter 를 시도하세요.


감사합니다.

댓글

이 블로그의 인기 게시물

Qt Designer 설치하기

PyQt5 기반 동영상 플레이어앱 만들기