윈도우 소켓 3편 채팅 프로그램을 만들어보자!

· by 정연한

윈도우 소켓에 대한 이해가 부족하다면 지난 편을 꼭 보고 와주세요!!

윈도우 소켓 1편
윈도우 소켓 2편

지난 2편에서 우리는 hello를 echo하는 간단한 서버, 클라이언트 프로그램을 만들었습니다.
이번 편에서는 단순히 텍스트를 echo하는 프로그램이 아니라 서로 텍스트를 주고 받는 간단한 채팅 프로그램을 한 번 만들어 보겠습니다.
조금 어려운 내용이 나올 수 있으니 잘 따라와주세요!

일단 기본 틀은 2편에서 완성한 코드를 그대로 가져오겠습니다.

#pragma comment(lib, "ws2_32")

#include <WS2tcpip.h>
#include <iostream>

using namespace std;

int main() {
	WSAData wsaData{ }; // 윈속 객체 생성
	WSAStartup(MAKEWORD(2, 2), &wsaData); // 윈속 객체 초기화

	// 소켓 디스크립터 생성
	auto sock{ socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) };

	constexpr int PORT{ 12345 };
	sockaddr_in addr{ AF_INET, htons(PORT) };
	addr.sin_addr.s_addr = htonl(INADDR_ANY);

	bind(sock, reinterpret_cast<sockaddr*>(&addr), sizeof(addr));
	listen(sock, SOMAXCONN);

	sockaddr_in client_addr{ };
	int client_size{ sizeof(client_addr) };
	auto client_sock{ accept(sock, reinterpret_cast<sockaddr*>(&client_addr), &client_size) };

	string sendMessage{ "hello" }; // 보낼 메세지 객체
	string recvMessage(1024, '\0'); // 받을 메세지 객체
	send(client_sock, &sendMessage.front(), sendMessage.length(), 0); // 메세지 송신
	recv(client_sock, &recvMessage.front(), 1024, 0); // 메세지 수신

	cout << recvMessage << endl;

	closesocket(client_sock);
	closesocket(sock);
	WSACleanup();
	return 0;
}

우선은 서버부터 보도록 합시다.
저번 코드를 그대로 가져오긴했지만, 주석을 좀 더 달고, 몇몇 변수의 이름이 좀 마음에 안들어서 바꿔주었습니다.


임시 저장 된 포스트입니다. 수정예정