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 |