네트워크 프로그래밍과 소켓의 이해

2022. 5. 22. 18:01네트워크

728x90

통신

  • 물리적으로 떨어진 서로 유무선으로 연결된 두 장비들 사이의 데이터 교환을 말함

네트워킹

  • 서로 다른 두 장비 간에 데이터 교환을 말함
  • 비교적 먼 거리의 데이터 전달이어서 출발지와 목적지 사이에 여러 장비를 거침
    • 장비들이 최단 경로를 고려 (라우팅)
  • 경로에 따라 데이터 전달은 IP가 담당
  • IP주소를 기반으로 동작

네트워크 프로그래밍

  • 소켓을 이용한 프로그래밍이기 때문에 소켓 프로그래밍이라고도 함
  • 네트워크로 연결된 둘 이상의 컴퓨터 사이에서의 데이터 송수신 프로그램 작성을 의미

소켓

  • 네트워크(인터넷) 연결 도구
  • OS에 의해 제공되는 소프트웨어 장치
  • 응용 프로그램과 운영체제 내 네이터 전송 프로토콜 사이를 연결하는 구조체
  • 응용 프로그램에서 소켓 함수를 통해 데이터 전달
  • 소켓의 주소정보는 IP와 PORT로 구

윈도우 소켓 헤더 및 라이브러리 설정

  • 헤더파일에 winsock2. h 포함
  • ws2_32.lib 라이브러리 링크

윈도우 소켓(winsock) 초기화

  • 윈도우소켓 프로그래밍을 할 때에는 반드시 WSAStartup 함수를 호출하여 초기화 작업을 진행해야함
#include <winsock2.h>

int WSAStartup(WORK wVersionRequested, LPWSADATA lpwSAData);
  • 성공시 0, 실패시 에러코드 값 반환
  • wVersionRequested : 프로그래머가 사용할 윈속의 버전 정보
  • lpWSAData: WSADATA 구조체 변수 주소값
  • 사용 예시
    #include <winsock2.h>
    int main(void) {
        WSADATA wsaData;
        // MAKEWORD(2, 2) : 주버전 2, 부버전 2, Ox0202
        if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0) {
        	ErrorHandling("WSAStartup() error!");
        }
    	...
    }

## 주요 구조체

typedef struct WSAData {
    WORK wVersion;
    WORK wHighVersion;
} WSADATA;
  • 윈소켓 구현에 대한 정보
  • wVersion : 주버전
  • wHighVersion : 부버전
    typedef struct sockaddr_in {
    short          sin_family;
    u_short        sin_port;
    struct in_addr sin_addr;
    char           sin_zero[8];
    } SOCKADDR_IN, *PSOCKADDR_IN, *LPSOCKADDR_IN;
  • 소켓의 주소 정보
  • sin_family : 주소 체계
    • PF_INET (IPv4 기반)
    • PF_INET6 (IPv6 기반)
  • sin_port : 포트번호
    • 16비트
    • 네트워크 바이트 순서(빅 엔디안)로 저장
  • sin_addr : 32비트 IP 주소
    • 네트워크 바이트 순서(빅 엔디안)로 저장
  • sin_zero : 사용 ㄴㄴ
    • 그냥 0 넣기

주요 메서드

#include <winsock2.h>

SOCKET socket(int af, int type, int protocol);
  • 소켓 생성
  • 성공시 소켓 핸들, 실패시 INVALID_SOCKET 반환
  • af: Address Family : 소켓이 사용할 프로토콜 체계 정보
    • AF_INET : IPv4 인터넷 프로토콜
    • AF_INET6 : IPv6 인터넷 프로토콜
  • type : 소켓의 데이터 전송 방식에 대한 정보
    • SOCK_STREAM
      • 연결 지향형 소켓
      • TCP 소켓을 할당할 때 사용
    • SOCK_DGRAM
      • 비 연결 지향형 소켓
      • UDP 소켓을 할당할 때 사용
  • protocol : 두 컴퓨터간 통신에 사용되는 프로토콜 정보
    • IPPROTO_HOPOPTS
      • 0과 같은 값
      • 앞에 type인자값을 기준으로 자동 결정
    • IPPROTO_TCP
      • 6과 같은 값
    • IPPROTO_UDP
      • 17과 같은 값
        핸들
        운영체제가 만든 파일(소켓)을 구분하기 위한 값(식별자)
#include <winsock2.h>

int bind(SOCKET s, const struct sockaddr *name, int nameLength);
  • 소켓에 주소정보(IP,Port) 할당
  • 성공시 소켓 핸들, 실패 시 SOCKET_ERROR 반환
  • SOCKET s : 주소 정보를 할당할 소켓
  • sockaddr *name : 할당하고자 하는 주소 정보
  • int nameLength : 두 번째 파라미터의 길이
#include <winsock2.h>

int listen(SOCKET s, int backlog);
  • 소켓이 클라이언트 프로그램의 연결 요청을 받아들일 수 있는 상태로 변환
  • 성공시 0, 실패시 SOCKET_ERROR 반환
  • SOCKET s : 상태변환을 할 소켓
  • backlog : 보류중인 연결 대기열의 최대 길이
#include <winsock2.h>

SOCKET accept(SOCKET s, struct sockaddr *addr, int *addrLength);
  • 클라이언트 프로그램과의 연결요청을 수락
  • 주로 서버 측에서 사용
  • 연결요청이 올때까지 대기
  • 성공시 소켓 핸들, 실패 시 INVALID_SOCKET 반환
  • SOCKET s : 연결요청을 수락할 소켓
  • socketaddr *addr : 연결 요청을 한 클라이언트의 주소 정보
  • *addrLength : 연결 요청을 한 클라이언트의 주소정보 길
#include <winsock2.h>

int connect(SOCKET s, const struct sockaddr *name, int nameLen);
  • 소켓 기반으로 연결요청
  • 주로 클라이언트 측에서 사용
  • 성공 시 0, 실패 시 SOCKET_ERROR 반환
  • SOCKET s : 연결 요청하는 소켓
  • sockaddr *name : 연결 요청할 대상(서버)의 주소정보
  • nameLen : 서버의 주소 정보 길이
#include <winsock2.h>

int closesocket(SOCKET s);
  • 소켓을 닫음
  • 성공시 0, 실패 시 SOCKET_ERROR 반환
#include <winsock2.h>
int WSACleanup(void);
  • 윈속 라이브러리를 해제
  • 호출 이후에 윈속 관련 함수 호출이 불가능
    • 즉, 프로그램 종료 직전에 호출
  • 성공시 0, 실패시 에러코드 반환
728x90

'네트워크' 카테고리의 다른 글

소켓의 타입과 프로토콜 설정  (0) 2022.05.22