메모내용
마우스 위치 표시

WinSocket

TCP 소켓 프로그래밍

TCP Server

TCP Client

Window Socket API
라이브러리 설정
Window Socket API
초기화
소켓
생성
소켓의
주소 설정
accept ( Server ) << connect ( Client )
소켓으로 데이터 수신
소켓으로 데이터 송신
소켓 닫기
Window Socket API
종료

winsock 라이브러리 임포트 및 초기화

#include <iostream> #define _WINSOCK_DEPRECATED_NO_WARNINGS //inet_addr 함수 에러 방지 #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") // library 설정 int main( ) { WSAData wsaData; // 2.2 버전 설정, 버전정보 데이터 가져오기, 소켓 API 시작설정 WSAStartup(MAKEWORD(2,2), &wsaData); // 정상이라면 0 의값이 나온다 //... WSACleanup(); // 소켓 API 종료 return 0; }

WSADATA

Windows Socket API(WinSock) 에서 사용하는 구조체 입니다.
WSAStartup 함수를 호출할 때 이 구조체를 사용하여
WinSock 라이브러리의 버전과 관련된 정보를 받아옵니다.
WinSock 라이브러리를 사용하기 위해 필요한 중요한 정볼르 담고있는 구조체

  • wVersion : 사용할 Winsock 버전 정보
  • wHighVersion : 최상위 Winsock 버전 정보
  • szDescription : Winsock 라이브러리에 대한 설명 문자열
  • szSystemStatus : Winsock 라이브러리의 상태에 대한 문자열
  • iMaxScokets : 동시에 열 수 있는 최대 소켓 수
  • iMaxUdpDg : 동시에 사용할 수 있는 최대 UDP 데이터그램 크기

WSAStartup

Windows Sockets API (WinSock) 라이브러리를 초기화하고
사용할 준비
를 하는 함수 WSAStartup 함수를 호출하지 않으면, Windows Sockets API (WinSock) 를 사용할 수 없으므로
반드시 호출해주어야 합니다.

Params

  • MAKEWORD(2,2)
    : WinSock 버전을 지정하는 매크로,
    이 경우 2.2 버전의 WinSock 라이브러리를 사용하도록 지정하고 있습니다.
  • &wsaData
    : 초기화 하는데 필요한 정보를 담고 있는
    WSADATA 구조체의 주소값이다.
    이 구조체는 WSAStartup 함수를 호출후에 초기화한
    라이브러리의 버전과 관련된 정보를 담고 있습니다.

소켓

소켓은 네트워크 프로그래밍에서의 기본 개념으로,
프로세스 간의 네트워크 통신을 위한 인터페이스를 제공하는 것을 말합니다.
소켓을 통해 프로세스 간에 데이터를 주고 받거나, 상호통신을 구현할 수 있습니다.

Descripter (디스크립터)

설명자
컴퓨터 운영체제에서 파일, 프로세스, 소켓등의
자원을 관리 및 추적 하는데 사용되는
양의 정수형 데이터 구조.
컴퓨터 운영체제는 각각의 자원에 고유한 디스크립터를 할당하여
이를 구분하고, 자원을 참조하는 과정에서 디스크립터를 사용한다.

예를들어, 파일 입출력을 할 때 파일을 열면
그 파일에 대한 디스크립터가 운영체제에서 할당되고,
이 디스크립터를 사용하여 파일을 읽고 쓸 수 있다.

마찬가지로, 소켓 통신을 할 때 소켓을 생성하면,
그 소켓에 대한 디스크립터가 운영체제에서 할당되고,
이 디스크립터를 사용하여 소켓 통신을 구현할 수 있다.

소켓 설명자는 소켓에 대한 저수준 핸들이며
운영체제의 네트워크 스택 내에서 소켓을 식별하는데 사용됩니다.
새 소켓이 생성되면 운영체제의 소켓에 네트워크 작업을 수행하는 데
소켓을 참조하는데 사용됩니다.

이 정수는 새 소켓이 생성이 될때 소켓시스템 호출에 의해 반환되며,
bind, listen, accept, send 및 recv 와 같은 후속 시스템 호출에서,
소켓을 참조하는 데 사용되며,
소켓의 상태, 주소패밀리, 소켓 유형, 프로토콜 및 기타정보를 포함하여
모든 소켓 관련 정보를 추적하는데 사용됩니다.
정리하자면
소켓 디스크립터는 소켓의 고유한 식별자 이다.

socket

소켓을 생성하는 함수.

서버 용 소켓
socket( ); bind( ); listen( ); accept( ) -> return SOCKET clientSocket
의 과정을 진행하여,
클라이언트가 연결할때까지 기다렸다가.
서버소켓에 연결시도한 클라이언트 소켓을 반환하는 용도로 사용된다.

클라이언트 용 소켓은
socket( ); connect( ); 과정을 거쳐
특정 주소를 가진 서버에 연결하고,
데이터를 송신 / 수신 하는 용도로 사용된다.

Params

  • int af = AF_INET
    : 주소 체계 (Address Family) 를 지정하며, AF_INET 은 IPv4 를 의미합니다.
  • int type = SOCK_STREAM
    : 소켓타입을 지정합니다. SOCK_STREAM 은 TCP 소켓을 의미합니다
  • int protocol = IPPROTO_TCP
    : 프로토콜을 지정합니다. IPPROTO_TCP 는 TCP 프로토콜을 의미합니다.

Return

  • SOCKET
    : 생성된 소켓의 디스크립터.
    이 디스크립터는 생성된 소켓을 구분하는 유일한 숫자입니다.
    이 디스크립터를 이용하여 'bind' 함수. 'listen' 함수. 'connect' 함수 등을 호출할 수 있습니다.
  • SOCKET

    SOCKET 구조체는 Windows 플랫폼에서 사용되는 소켓 타입입니다.
    SOCKET 구조체는 소켓을 생성하고 , 연결하고, 데이터 전송/수신 을 수행하는데 필요한
    Descripter(디스크립터, 설명자) 가지고 있습니다.
    SOCKET 구조체는 실제로 int 타입을 가지고 있지만,
    Winsock API 에서는 SOCKET 타입으로 정의되어 있습니다.

    SOCKET 구조체는 여러가지 연결상태에서 소켓의 상태를 표현할 수 있습니다.
    INVALID_SOCKET 은 소켓을 생성하지 않은 상태를 나타냅니다.
    listen 상태의 소켓은 listen 함수에서 반환된 SOCKET 구조체를 통해서 표현할 수 있습니다.
    연결상태의 소켓은 accept 함수에서 반환된 SOCKET 구조체를 통해서 표현할 수 있습니다.

    SOCKET socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP ); // server , client 동일

    sockaddr_in

    sockaddr_in 구조체는 Winsock 라이브러리에서 사용하는 IP 주소 구조체 입니다.

    in_addr_t 구조체는 Internet 주소를 표현하는 데 사용되는 32비트 정수형 데이터 타입입니다.
    IP 주소는 4개의 8비트 값으로 구성되어 있어서,
    이를 단일 32 비트 정수로 표현하는 것이 효율적입니다.
    in_addr_t 는 unsigned long 타입이며, IP 주소를 저장하는데 사용될 수 있습니다.
    IP 주소는 네트워크 바이트 순서로 표현되며
    호스트 바이트 순서로 표현하려면 htonl( ) 함수 또는 ntohl( ) 함수를 사용할 수 있습니다.

    struct in_addr { in_addr_t s_addr; } struct sockaddr_in{ short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }

    bind

    TCP 서버 소켓의 IP 주소와 포트 번호를 지정하는 함수
    bind 함수는 지정된 IP 주소와 포트 번호를 갖는 소켓에 대한 연결을 설정하는데 사용됩니다.
    이코드는 INADDR_ANY 라는 상수를 통해 어떤 IP 주소라도 수용할 수있는 상태로 설정하며,

    Params

    listen

    주어진 socket 에 대해 listen queue (연결 요청 대기 큐) 를 생성합니다.
    이 함수를 호출한 socket 은 서버 소켓이 됩니다.
    listen 함수 호출 후에 accept 함수를 호출하여 클라이언트의 요청을 수용할 수 있습니다.

    Params

    accept

    새로운 클라이언트가 연결 요청을 할 때까지 기다리는 역할을 합니다.
    함수가 호출되면, 새로운 클라이언트와의 연결이 생성되고,
    새로운 클라이언트와의 통신을 위한 소켓인 client Socket 이 반환됩니다.
    파라미터 NULL 은 새로운 클라이언트의 주소 정보를 받지 않기 위해서 사용되었습니다.
    accept 함수는 성공시 연결된 클라이언트 소켓의 핸들을 반환하며,
    실패시 INVALID_SOCKET 값을 반환합니다.

    함수는 블로킹 함수 로 작동하며, 클라이언트의 연결 요청이 수신되기 전까지
    함수 호출이 대기 상태로 유지 됩니다.

    Params

    recv

    데이터를 수신하는 함수

    Params

    Return

  • int
    : 수신한 데이터의 크기 (바이트).
    recv 함수가 0 을 반환할 경우, 소켓 연결이 종료된 것으로 간주할 수 있습니다.
    만약 수신한 데이터가 버퍼의 크기보다 크다면,
    여러번의 recv 호출이 필요할 수 있습니다.