본문 바로가기
socket programming

C/C++ windows Socket Programming tutorial

by 몰라몰라개복치 2020. 3. 2.

1. 개념 정리

 

(1). 소켓이란

 

• 네트워크를 경유하는 프로세스 간 통신의 접속점 

• 프로그램 간에 클라이언트와 서버가 통신할 수 있게 하는 역할

• 네트워크 프로그래밍에서 request, receive 패킷 등등을 캡슐화 시킨 형태

 

 

(2). 동작 과정

동작 과정

>서버 

socket()->bind()

 소켓을 서버의 로컬 ip 주소, 포트와 연결(클라이언트에게서 요청을 받을 통로를 여는 과정)

listen()

 클라이언트의 요청을 기다림

accept()

 요청을 받아들임 

 

>클라이언트 

socket()

 소켓 생성

connect()

 연결 요청

 

2. 실습 - google에 http 요청 보내는 코드 작성

 

필요한 헤더

 

전처리기 선언 

전처리기: 임의의 소스 파일을 가져와서 브라우저가 이해할 수 있는 것으로 변환시켜주는 도구

 

 

 

WinSock 초기화

WASADATA 즉 스타트업 구조체를 통하여 main 내부에 winsock을 초기화

if{~}: 초기화 실패시 프로그램 종료 코드

 

 

socket 생성

PF_INET : IPv4 프로토콜

SOCK_STREAM : 연결 지향 (TCP)

0 : 특정 프로토콜을 사용하는 부분.

 

host 설정

gethostbyname: host 도메인 이름을 ip 주소로 변환해주는 함수 

 

 

socket 상세 주소 지정

addr.sin_family = AF_INET 

 - 인터넷 주소 체계 IPv4 사용 

addr.sin_port = htons(80) 

 - host to network short (리틀엔디안에서 빅엔디안으로 변환) 

 - PC는 리틀엔디안, 네트워크는 빅엔디안 방식으로 데이터 저장하기 때문

 - 포트 80 사용

addr.sin_addr.s.addr = inet……… 

 - 호스트의 ip 주소를 형식에 맞게 변환 후 소켓 IP 주소로 지

 

*엔디안: 컴퓨터의 메모리와 같은 1차원의 공간에 여러개의 연속된 대상을 배열하는 방법

*빅엔디안: 큰 단위가 앞에 나옴, 최상위 바이트부터 차례로 저장하는 방식  

*리틀엔디안: 작은 단위가 앞에 나옴, 최하위 바이트부터 차례로 저장하는 방식

 

 

connect
SEND&RECEIVE

url="~"

send(url) 방식이 계속 문법 오류가 생겨 정의 없이 직접 링크를 넣었음

 

메시지 출력과 종료

 

3. 사용된 함수 원형 설명

 

>SOCKET 원형 

int socket(int domain, int type, int protocol);

 -리턴 값

  성공: file descripter

  실패시: -1

 

 -DOMAIN(소켓 종류) 

 생성할 소켓이 통신을 하기 위해 사용할 프로토콜 체계를 설정

  • PF_INET : IPv4 인터넷 프로토콜 사용
  • PF_INET6 : IPv6 인터넷 프로토콜 사용
  • PF_LOCAL, AF_UNIX: 같은 시스템 내에서 프로세스끼리 통신
  • PF_PACKET: Low level socket을 위한 인터페이스
  • PF_IPX: IPX 노벨 프로토콜

 -TYPE : 소켓이 데이터를 전송하는데 있어서, 사용하게 되는 전송 타입을 설정

  •  SOCK_STREAM : 연결 지향형 소켓
        - 에러나 데이터의 손실 없이 무사히 전달.
        - 전송하는 순서대로 데이터가 전달.
        - 전송되는 데이터의 경계가 존재하지 않음.
        => 신뢰성 있는 순차적인 바이트 기반의 연결 지향 전송 타입
  •  SOCK_DGRAM : 비연결 지향형 소켓
        - 전송되는 순서에 상관없이 가장 빠른 전송을 지향.
        - 전송되는 데이터는 손실될 수도 있고, 에러가 발생할 수 있음.
        - 전송되는 데이터의 경계가 존재.
        - 한번에 전송되는 데이터의 크기는 제한.

 

 

>SOCKADDR_IN 원형

소켓을 어디로 보낼지 주소를 써넣어주는 단계

sin_family: 항상 AF_INET을 설정 필수임

sin_port: 포트 번호를 가짐. 2byte. 즉, 포트번호는 0~65535의 범위를 갖는 숫자 값이다.

sin_addr: 호스트의 IP 주소

sin_zero: 반드시 0바이트로 채워져 있어야 함

 

 

>hostent 원형

hostent 구조체

소켓 라이브러리가 DNS 서버에 조회하여 IP주소나 도메인명을 찾는 기능을 제공. 이와 같은 정보를 hostent 구조체에 담아서 반환해주는 것이다. 덕분에 개발자가 IP주소를 알아내기위해 별도로 구현할 것이없다

 

>CONNECT 원형

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); 

int sockfd : 소켓 디스크립터 

struct sockaddr *serv_addr : 서버의 주소 정보를 지닌 구조체 변수의 포인터 

int addrlen : serv_addr 포인터가 가리키느는 주소 정보 구조체 변수의 크기 
반환 실패 시 : -1 성공 시 : 0

 

>SEND&RECEIVE 원형

int send(int s, const void *msg, size_t len, int flags);

int s : 소켓 디스크립터

void *msg : 전송할 데이터

size_t len : 데이터의 바이트 단위 길이

int flags : MSG_DONTWAIT(대기 상태 기다리지 않고 복귀) MSG_NOSIGNAL
반환 

실패 시 : -1 성공 시 : 실제 전송할 바이트 수

 

4. 실행화면 

 

 

 

 

 

 

 

'socket programming' 카테고리의 다른 글

DDos Generator(1)  (0) 2020.03.18
Thread pool 개념 정리  (0) 2020.03.18
멀티스레드  (0) 2020.03.16
웹서버 구현  (0) 2020.03.09
웹 서버 & 클라이언트 채팅 프로그램  (0) 2020.03.06