1. 개념 정리
(1). 소켓이란
• 네트워크를 경유하는 프로세스 간 통신의 접속점
• 프로그램 간에 클라이언트와 서버가 통신할 수 있게 하는 역할
• 네트워크 프로그래밍에서 request, receive 패킷 등등을 캡슐화 시킨 형태
(2). 동작 과정
>서버
socket()->bind()
소켓을 서버의 로컬 ip 주소, 포트와 연결(클라이언트에게서 요청을 받을 통로를 여는 과정)
listen()
클라이언트의 요청을 기다림
accept()
요청을 받아들임
>클라이언트
socket()
소켓 생성
connect()
연결 요청
2. 실습 - google에 http 요청 보내는 코드 작성
전처리기: 임의의 소스 파일을 가져와서 브라우저가 이해할 수 있는 것으로 변환시켜주는 도구
WASADATA 즉 스타트업 구조체를 통하여 main 내부에 winsock을 초기화
if{~}: 초기화 실패시 프로그램 종료 코드
PF_INET : IPv4 프로토콜
SOCK_STREAM : 연결 지향 (TCP)
0 : 특정 프로토콜을 사용하는 부분.
gethostbyname: host 도메인 이름을 ip 주소로 변환해주는 함수
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차원의 공간에 여러개의 연속된 대상을 배열하는 방법
*빅엔디안: 큰 단위가 앞에 나옴, 최상위 바이트부터 차례로 저장하는 방식
*리틀엔디안: 작은 단위가 앞에 나옴, 최하위 바이트부터 차례로 저장하는 방식
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 원형
소켓 라이브러리가 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 |