소켓 프로그래밍 기초

1. 소켓이란

네트워크 상의 두 프로그램 간 양방향 통신 링크의 한쪽 끝점을 나타낸다.

소켓을 사용하면 같은 기기 내의 프로세스 간 통신뿐만 아니라 네트워크로 연결된 다른 기기의 프로세스와도 통신할 수 있다.

 

특징:

  - IP 주소와 포트 번호의 조합으로 식별

  - 양방향 통신을 지원

  - 다양한 프로토콜(TCP, UDP 등) 사용 가능

 

 

2. 소켓 프로그래밍 API

2.1. 주요 함수

socket() : 새로운 소켓을 생성
bind() : 소켓에 IP 주소와 포트 번호를 할당
listen() : 서버 소켓이 클라이언트의 연결 요청을 받을 수 있도록 함
accept() : 클라이언트의 연결 요청을 수락
connect() : 클라이언트 소켓이 서버에 연결을 요청
send(), recv() : 데이터를 송수신
close() : 소켓을 닫음

 

 

2.2. 윈도우에서의 소켓 프로그래밍 API

소켓프로그래밍의 API는 운영체제별로 사용법이 조금씩 다르다.

앞으로 나올 예시에서는 윈도우를 기준으로 설명한다.

 

Winsock (Windows Socket)

  - Windows 운영 체제에서 사용

  - 헤더: <winsock2.h>

  - 사용 전 WSAStartup() 함수로 초기화가 필요

  - 종료 시 WSACleanup() 함수를 호출해 소켓 작업을 종료

 

 

3. 환경 설정

Windows에서는 Winsock 라이브러리를 링크해야 한다.

이때 Winsock과 Winsock2가 있는데, Winsock은 구식이므로 Winsock2.h를 include 해야한다.

 

1) 프로젝트에 ws2_32.lib 라이브러리를 추가

비주얼 스튜디오의 경우 프로젝트속성-링커-입력에서 추가 종속성 설정

이 과정이 귀찮으면 아래 코드를 추가하면 된다.

#pragma comment(lib, "ws2_32");

 

 

2) Winsock2.h 헤더 추가

대소문자는 상관없다.

#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

 

 

ex)

간단한 TCP 서버

#include <iostream>
#include <string>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#define PORT 7777
using namespace std;

int main() {
    WSADATA wsaData;
    if (::WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        return 1;

    /// 서버
    // 소켓 생성
    SOCKET listenSocket = ::socket(AF_INET, SOCK_STREAM, 0);

    SOCKADDR_IN serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(PORT);

    // 바인드
    ::bind(listenSocket, (SOCKADDR*)&serverAddr, sizeof(serverAddr));

    // 리스닝
    ::listen(listenSocket, SOMAXCONN) == SOCKET_ERROR;

    // 연결 성공
    cout << "Accept" << endl;


    /// 클라이언트 
    // 연결 수락
    SOCKADDR_IN clientAddr;
    int addrLen = sizeof(clientAddr);

    SOCKET clientSocket = ::accept(listenSocket, (SOCKADDR*)&clientAddr, &addrLen);

    cout << "Client Connected" << endl;

    // 데이터 송수신
    char recvBuffer[100] = { 0 };
    int recvLen = ::recv(clientSocket, recvBuffer, sizeof(recvBuffer), 0);

    cout << "Received Data : " << recvBuffer << endl;

    char sendBuffer[100] = "Hello Client!";
    ::send(clientSocket, sendBuffer, strlen(sendBuffer), 0);

    ::WSACleanup();
}

 

위 예시는 간단하게 서버의 구조를 보여주는 스크립트다.

간단하게 어떻게 사용될지만 확인하고 구체적인 내용은 이후 내용에서 소개하겠다.

'학습 > C++ 소켓 프로그래밍' 카테고리의 다른 글

UDP 소켓 프로그래밍  (0) 2024.10.31
TCP 소켓 프로그래밍  (0) 2024.10.31
소켓 프로그래밍  (0) 2024.10.29
네트워크 프로그래밍 기초  (0) 2024.10.22
소켓 프로그래밍 학습목차  (0) 2024.10.15