[c++] 소켓 통신을 위한 클라이언트-서버 모델 구현

이번 포스트에서는 C++을 이용하여 클라이언트-서버 모델을 활용한 소켓 통신에 대해 알아보겠습니다.

서버 구현

먼저, 서버를 구현하기 위해서는 다음과 같은 단계를 따라야 합니다:

  1. 소켓 생성: socket 함수를 사용하여 소켓을 생성합니다.
  2. 서버 정보 설정: sockaddr_in 구조체를 사용하여 서버의 IP 주소와 포트 번호를 설정합니다.
  3. 바인딩: bind 함수를 사용하여 소켓에 IP 주소와 포트를 바인딩합니다.
  4. 리슨 모드 진입: listen 함수를 사용하여 클라이언트의 연결 요청을 대기합니다.
  5. 연결 수락: accept 함수를 사용하여 클라이언트의 연결 요청을 수락하고 새로운 소켓을 생성합니다.
  6. 데이터 통신: sendrecv 함수를 사용하여 클라이언트와 데이터를 주고받습니다.

아래는 이러한 단계들을 코드로 나타낸 예시입니다.

// 소켓 생성
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);

// 서버 정보 설정
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.s_addr = INADDR_ANY;

// 바인딩
bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr));

// 리슨 모드 진입
listen(serverSocket, SOMAXCONN);

// 연결 수락
sockaddr_in clientAddr;
int clientAddrSize = sizeof(clientAddr);
int clientSocket = accept(serverSocket, (sockaddr*)&clientAddr, &clientAddrSize);

// 데이터 통신
char buffer[4096];
int bytesReceived = recv(clientSocket, buffer, sizeof(buffer), 0);
send(clientSocket, buffer, bytesReceived, 0);

클라이언트 구현

이어서 클라이언트를 구현하기 위한 단계는 다음과 같습니다:

  1. 소켓 생성: socket 함수를 사용하여 소켓을 생성합니다.
  2. 서버 정보 설정: sockaddr_in 구조체를 사용하여 서버의 IP 주소와 포트 번호를 설정합니다.
  3. 연결 요청: connect 함수를 사용하여 서버에 연결을 요청합니다.
  4. 데이터 통신: sendrecv 함수를 사용하여 서버와 데이터를 주고받습니다.

클라이언트의 코드 예시는 다음과 같습니다.

// 소켓 생성
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);

// 서버 정보 설정
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr);

// 연결 요청
connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr));

// 데이터 통신
char buffer[4096];
int bytesReceived = recv(clientSocket, buffer, sizeof(buffer), 0);
send(clientSocket, buffer, bytesReceived, 0);

이렇게 클라이언트와 서버를 구현하여 소켓 통신을 수행할 수 있습니다.

결론

이번 포스트에서는 C++을 사용하여 클라이언트-서버 모델을 이용한 소켓 통신에 대해 알아보았습니다. 소켓 통신은 네트워크 프로그래밍에서 중요한 부분이며, 이를 통해 다양한 응용프로그램을 개발할 수 있습니다. 추가적으로, 소켓 통신에 관해 더 알고 싶다면 관련 자료와 레퍼런스를 참고해 보시기 바랍니다.