2016년 5월 12일 목요일

뇌자극 TCP_IP 프로그래밍 7강 요약

-인터넷 주소 클래스-

A클래스 - 국가 수준의 네트워크 구성 (0.0.0.0 ~ 127.255.255.255)
B클래스 - 종합 대학교나 규모가 큰 연구소 이상 (128.0.0.0 ~ 191.255.255.255)
C클래스 - 중소규모의 기업 (192.0.0.0 ~ 223.255.255.255)
D클래스 - 멀티캐스트 네트워크 구성(224.0.0.0 ~ 239.255.255.255)
E클래스 - 남겨둔 영역(240.0.0.0 ~ 255.255.255.255)

-리눅스에서 인터넷 주소 변환-

점 표기 주소 방식 -> 바이너리 인터넷 주소로 변환 함수

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

in_addr_t inet_addr(const char *cp);
int inet_aton(const char *cp, struct in_addr *inp);

cp : 변환하려는 인터넷 주소
inet_addr : 변환된 IP인터넷 주소를 반환

inp : 변환된 값을 넘겨줌
inet_aton : IPv6에서도 사용 가능한 함수

바이너리 인터넷 주소 -> 점 표기 주소 방식로 변환 함수

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

char *inet_ntoa(struct in_addr in);

-도메인 이름-

도메인 : 다른 문자를 이용해 이름을 붙인 주소

인터넷 주소 목록 가져는 함수
#include <netdb.h>

struct hostnet *gethostbyname(const char *name);

name: 변환할 도메인 이름

-윈도우에서 인터넷 주소, 도메인 이름 변환-

점 표기 주소 방식 -> 바이너리 주소로 변환 하는 함수
unsigned long inet_addr (
     __in const char *
)

도메인 이름에서 주소 정보 얻어오는 함수
gethostbyname() 함수를 사용한다.


2016년 5월 5일 목요일

뇌자극 TCP_IP 프로그래밍 6강 요약

세상에는 수많은 컴퓨터가 있고, 수많이 연결되어 있다.
그러다 보니 데이터를 처리하는 방식이 다른 경우가 많다.
인터넷으로 돌아다닐 데이터는 상대방 컴퓨터가 어떤 CPU를 쓰는지 모른다.
그래서 이것을 통일 시켜줘야 한다.

서로 다른 데이터 읽는 방식의 교류를 위해 "네트워크 바이트 순서" 를 정했다.
인터넷으로 데이터를 보낼 때는 무조건 네트워크 바이트 순서로 변환해서 내보내야 한다.

바이트 순서 변환 함수는 다음과 같다

#include <netinet/in.h>

unsigned long int htonl(unsigned long int hostdata)
unsigned short int htons(unsigned short int hostdata)

unsigned long int ntohl(unsigned long int netdata)
unsigned short int ntohs(unsigned short int netdata)

자세히 보면 일정한 패턴이 있다.

데이터를 보낼 때
htonl = host to network (long)
htons = host to network (short)

데이터를 받을 때
ntohl = network to host (long)
ntohs = network to host (short)

예제)
//쓸 때 (보낼 때)
mydata.age = htons(25);
mydata.birthday = htonl(19811203);

//읽을 때 (받을 때)
read((void*)&mydatainfo, .....);
ntohs(mydatainfo.age);
ntohl(mydatainfo.birthday);

뇌자극 TCP_IP 프로그래밍 5강 요약

오늘은 어린이 날인데도 집에서 공부하고, 블로그나 올리는거다 ;;;
1. 리눅스에서는 모든게 다 파일이다.
2. 표준 입력, 표준 출력, 표준 에러들이 있다.
3. 소켓도 파일로 처리한다.

파일은 열고 -> 쓰고/읽고 -> 닫고 의 과정을 거친다.
모든 파일에는 소유자와 그룹별로 읽기, 쓰기, 실행 의 권한을 설정할 수 있다.

예를 들어 이런 권한이 있다고 하자
drwxr-xr-x
이게 뭔 x소리인가 하겠지만....;; 끊어 읽으면 편하다.
d rwx r-x rw-
d는 디렉토리를 뜻한다. 파일일 때는 -로 쓴다.
다음 3자리는 소유자 권한 부분이다.(rwx 니깐 읽고, 쓰고, 실행까지 가능한거다)
다음 3자리는 그룹 권한 부분이다. (r-x 니깐 읽고, 실행만 가능하다)
다음 3자리는 기타 권한 부분이다. (rw- 니깐 읽고, 쓰기만 가능하다).

위의 권한을 숫자로 표현하기도 한다.
rwx = 7 = 111(2진수),  r-x = 5 = 101(2진수), rw- = 6 = 110(2진수)
다 합해서 756 이라고 표현한다.

chmod 756 파일명  <--- 이 명령어로 해당 파일에 위와 같은 권한을 줄수 있다.

파일 열기

open 함수로 파일을 열수 있다.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

pathname : 열고자 하는 파일 이름
flags : 파일의 접근 방식과 생성 방식을 결정
mode : 파일의 권한을 결정하기 위해 사용

파일 읽기/쓰기

read 함수로 파일의 내용을 읽을 수 있다.

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

fd : open 함수로 생성된 파일 지정 번호다
buf : 읽은 데이터를 저장하기 위한 변수다
count : 읽은 데이터의 크기다.

write 함수로 파일의 내용을 쓸 수 있다.

#include <unistd.h>
ssize_t write(int fd, void *buf, size_t count);

fd : open 함수로 생성된 파일 지정 번호다
buf : 쓰려는 데이터다.
count : 쓰려는 데이터의 크기다.

파일 닫기

close 함수로 파일을 닫을 수 있다.

close(int fd);

fd : open 함수로 생성된 파일 지정 번호다.

2016년 5월 4일 수요일

뇌자극 TCP_IP 프로그래밍 4강 요약

소켓 네트워크 프로그래밍의 흐름

1. 소켓을 만든다. -> socket 함수 사용
2. 클라이언트 : 연결을 시도한다 -> connect 함수 사용
   서버 : 연결을 기다린다. -> accept 함수 사용
3. 소켓으로 통신한다. -> read / write 함수 사용
4. 소켓을 닫는다. -> close 함수 사용

클라이언트와 서버의 프로그램의 흐름

클라이언트
socket() -> connect() -> read()/write() -> close()

connect(): 서버에 연결 시도한다.

서버
socket() -> bind() -> listen() -> accept() -> read()/write() -> close()

bind() : 소켓의 특성을 정의 한다. (프로토콜, IP주소, 포트)
listen() : 여러 클라이언트가 접속 요청할 때 대기열을 지정한다.
accept(): 클라이언트의 연결을 수락한다.

socket 함수
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

domain - AF_UNIX : 시스템 내부에서 프로세스 간의 통신
           - AF_INET : 인터넷 영역에서 컴퓨터 간의 통신(IPv4)
           - AF_INET6 : 인터넷 영역에서 컴퓨터 간의 통신(IPv6)

type - SOCK_STREAM : TCP 기반 통신
       - SOCK_DGRAM : UDP 기반 통신
protocol - IPPROTO_TCP : TCP 프로토콜
            - IPPROTO_DUP : UDP 프로토콜
반환값 - 성공하면 0 이상의 소켓 지정 번호, 실패하면 -1

bind 함수
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);

sockfd : socket 함수로 생성된 소켓
my_addr :  IP주소/port 번호를 저장하기 위한 변수가 있는 구조체
addrlen : my_addr의 데이터 크기
반환값 : 성공하면 0, 실패하면 -1

listen 함수
int listen(int sockfd, int backlog)

sockfd : 소켓 지정번호
backlog : 수신 대기열의 크기
반환값: 성공하면 0, 실패하면 -1

accept 함수
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

sockfd : 소켓 지정 번호
addr : 클라이언트의 주소와 포트 정보를 구조체에 복사
addrlen : sockaddr 구조체의 크기

connet 함수
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

sockfd : 소켓 지정 번호
serv_addr : 연결할 서버의 IP 주소와 포트등의 정보를 알려주기 위해 사용
addrlen : server_addr의 크기
반환 값 : 연결 성공하면 0, 실패하면 -1

read/write 함수
ssize_t read(int fd, void *buf, size_t count);
ssize_t write (int fd, void *buf, size_t count);

fd : 열린 파일의 파일 지정 번호
buf : 읽기/쓰기 데이터가 저장될 버퍼 변수
count :  읽기/쓰기 데이터의 count 크기
반환값 : 성공하면 읽기/쓰기 데이터의 크기(byte 단위), 실패하면 -1

close 함수
int close(int sockfd);

sockfd : 닫고자 하는 소켓 지정 번호

-윈도우 소켓 프로그래밍-
윈도우는 윈속을 이용해서 소켓 프로그래밍을 한다.
나머지는 다 동일한데 몇 가지만 다르다.

1. 윈속을 사용하기 위해 ws2_32.lib 를 속성에 추가해야 한다
2. WSAStartup 함수를 호출한다.
3. recv 와 send를 통해 데이터 입출력을 해야 한다.
4. closesocket 로 소켓 해제
5. WSACleanup로 WSAStartup 함수 해제

WSAStartup 함수
int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData);

wVersionRequested : 윈속의 버전 (2, 2 를 쓰면 된다.)

recv / send 함수
int recv(SOCKET s, char *buf, int len, int flags);
int send(SOCKET s, char *buf, int len, int flags);

s : 소켓 지정 번호
buf : 읽기/쓰기 데이터가 저장될 버퍼 변수
len : buf의 크기
flags : 소켓 제어를 위한 flags(0을 쓰면 된다)

closesocket 함수
closesocket(SOCKET s);

s: 해체할 소켓의 지정 번호

WSACleanup함수
WSACleanup() : 윈속 함수 끝

뇌자극 TCP_IP 프로그래밍 3강 요약

3강에서는 소켓과 네트워크에 관한 간단한 요약을 소개한다.

소켓이란?

네트워크 프로그램을 작성하기 위한 라이브러리를 포함한 API를 제공한다.

-서버/클라이언트 모델-
서버의 IP와 포트 번호를 알고 있으면
클라이언트에서 연결해서 서로 통신을 주고 받을 수 있게 해준다.

-명시된 포트 번호 -

20, 21 - FTP
22 - SSH
23 - 텔넷
25 - SMTP
37 - TIME
53 - 도메인
80 - HTTP
110 - POP3

1~1023 까지는 명시적으로 할당된 포트 번호이기에
개발자가 네트워크 프로그래밍을 할 때는
이 범위의 포트 번호는 피해서 작성해야 한다.

뇌자극 TCP_IP 프로그래밍 2강 요약

2강은 네트워크 프로그래밍을 위해서 환경 설정하는 장이다.

윈도우와 리눅스를 같이 써야 하기에
vmware 에 우분투 14를 설치하고 번갈아가며 공부 했다.

리눅스 코딩 환경
os - 우분투 14
IDE - 코드블럭
컴파일러 - GCC, G++

윈도우 코딩 환경
os - 윈도우 10
IDE - vs 커뮤니티 2015

리눅스 같은 경우에는 바로 코딩해도 되지만

윈도우에서 소켓 프로그래밍을 하려면
프로젝트에서 오른 클릭 -> 속성 -> 구성속성 ->
링커 -> 입력 -> 추가종속성 -> 편집
에서 ws2_32.lib 를 입력해주고 확인 적용을 눌러줘야 한다.

아래 그림과 같이 해줘야 한다.


리눅스나 윈도우나 프로젝트는 콘솔에서 C언어로 작성한다.

뇌자극 TCP_IP 프로그래밍 1강 요약

열혈강의로 소켓 프로그래밍을 공부했었고 여기에 요약?을 했었다.
근데 뇌자극 시리즈가 더 나에게는 뇌에 잘 들어오더라...;;
그래서 각 장을 요약 정리 할려고 한다.
현재 11강까지 마친 상태다.

OSI 7 계층

응용계층 - 응용프로그램 HTTP, FTP 같은 프로토콜
표현계층 - 데이터를 인터넷으로 전송할 때 데이터를 다루기 좋은 형태로 가공
세션계층 - 컴퓨터끼리 연결 되었을 때 소프트웨어의 통신을 관리하기 위한 규격
전송계층 - 신뢰성 있는 데이터 전송을 보장하기 위한 규격
네트워크 계층 - 네트워크 경로를 찾아주기 위한 규격
데이터 링크 계층 - 오류 제어와 흐름 제어를 위한 규격
물리계층 - 시스템을 연결하기 위한 전기/물리적 규격

TCP/IP 4계층 - 위의 OSI 7계층을 4개로 묶은 계층이다.

응용 계층(응용 + 표현 계층) - HTTP, FTP, DNS, POP3, SNMP
전송 계층(세션 + 전송 계층) - TCP, UDP
인터넷 계층(네트워크 + 데이터 링크 계층) - ICMP, IP, ARP, RARP
물리 계층 (물리 계층) - 이더넷, 프레임 릴레이, 토큰 프레임, ATM