2014년 12월 9일 화요일

TCP/IP 소켓 프로그래밍 5강

원래는 4강에 있는 소스에서 나타난 문제점을 해결하는 강인데
후반에 이론이 있기에 이론만 설명하려고 한다 ㅡ.ㅡ;
내가 절대로 소스코드를 여기에 적기 싫어서 이러는거다.

1. TCP 소켓에 존재하는 입출력 버퍼

TCP 소켓의 데이터 송수신에는 경계가 없다.
서버가 한번의 write 함수 호출을 통해서 40바이트를 전송해도
클라이언트는 4번의 read 함수 호출을 통해서 10바이트씩 데이터를 수신하는 것이 가능하다
근데, 10바이트 보내고 나면 나머지 30바이트는 어디에 있는걸까??
write()가 호출되면 출력버퍼에, read()가 호출되면 입력버퍼에 전송된다.

-입출력 버퍼는 TCP 소켓 각각에 대해 별도로 존재한다
-입출력 버퍼는 소켓생성시 자동으로 생성된다
-소켓을 닫아도 출력버퍼에 남아있는 데이터는 계속해서 전송이 이뤄진다.
-소켓을 닫으면 입력버퍼에 남아있는 데이터는 소멸되어 버린다.

2. TCP의 내부 동작원리1 : 상대 소켓과의 연결

TCP 소켓의 생성에서 소멸의 과정까지 거치는 단계는 다음과 같다
-상대 소켓과의 연결
-상대 소켓과의 데이터 송수신
-상대 소켓과의 연결종료

예를 들면 호스트 a와 호스트 b가 통신을 하려고 한다고 하면

1) a -> b : [SYN] SEQ:1000 ACK:-
2) b -> a : [SYN+ACK] SEQ:2000 ACK:1001
3) a -> b : [ACK] SEQ:1001 ACK:2001

를 서로 주고 받는다.
그럼 각 의미를 알아보자

1) a가 b랑 통신하려면 먼저 b가 통신 가능한지 물어봐야 한다

처음 연결요청에 사용되는 메시지이기 때문에 이 메시지를 가리켜 SYN이라 한다
SYN은 Synchronization의 줄임말이고, 데이터 송수신에 앞서 '동기화 메시지'라는 의미를 가지고 있다.

2) b가 a에게 2000번의 번호를 부여하니 잘 받았으면 2001번의 패킷을 전달해줘이다.
ack 1001번은 1번에서 보낸 SEQ 1000은 잘 받았으니 1001번을 보내달라는 표시다

이번에는 a에게 받은 1000에 대한 응답 + 새로운 2000번을 동시에 보냈다.
b가 a에 대한 응답과 동기화 메세지를 동시에 보내서 SYN+ACK라고 부른다

3) a는 1001번 패킷을 받고 2000인 패킷은 잘 받았으니, 다음 번에는 SEQ가 2001인 패킷을 전송해달라고 요청한다.

한마디로 서로 제대로 접속해서 살아있는지 서로 확인하는 과정이다.
이렇게 3번을 왔다갔다 한다고 하여 Three-way handshaking 이라고 한다.
3번 악수하며 확인했다는 것이다 ㅡ.ㅡ

3. TCP의 내부 동작 원리 2 :상태 소켓과의 데이터 송수신

데이터 송수신 준비가 끝났으니 실질적인 데이터를 송수신 해보자.
만약 a가 b에게 총 200바이트를 두번에 나눠서 전송한다고 가정하고 설명해본다
ACK 번호 -> SEQ번호 + 전송된 바이트 크기 + 1

1) a -> b : SEQ 1200, 100바이트 데이터
2) b -> a : ACK 1301
3) a -> b : SEQ 1301, 100바이트 데이터
4) b -> a : ACK 1402

1) 100바이트의 데이터를 보내면서 1200번을 패킷에 부여해서 b로 보낸다
2) 잘 받은 b는 1301번을 패킷에 부여해서 다시 보낸다.
(1301이 된 이유는 받은 1200 + 100 바이트 데이터 + 다음 숫자 1)
3) 1301번을 잘 받았으면, 다음 100바이트 데이터를 b로 보낸다
4) 잘 받았으면 1402번을 a로 보낸다

4. TCP의 내부 동작 원리 3 : 상대 소켓과의 연결 종료

1) a->b : [FIN] SEQ:5000 ACK: -
2) b->a : [ACK] SEQ:7500 ACK:5001
3) b->a : [FIN] SEQ:7501 ACK:5001
4) a->b : [ACK] SEQ:5001 ACK:7502

1) a가 b에게 종료를 하겠다고 알린다. FIN이 종료를 알리는 메시지다
2) b가 a에게 내용을 잘 받았다고 5001번을 부여해서 응답한다
3) b가 a에게 자신도 종료할 준비가 되었다고 알린다
4) a가 b에게 잘 받았다고 응답하고 종료한다.

이것도 역시 소스코드를 보며 구현해보는 것이 좋겠다.

소스 코드 받기

다음 6강은 UDP 소켓인데 내가 이제 막 책으로 공부하고 있는 과정이라
공부가 끝나면 여기에 올리겠다 ㅡㅡ;;
(오늘까지는 공부했던 과정이라 연속으로 올릴수 있었다 ㅎㅎ;;)

2014년 12월 8일 월요일

TCP/IP 소켓 프로그래밍 4강

본격적으로 4강에서는 TCP를 이용해서 통신해보자
먼저 TCP/IP의 구조를 알아야하게 않겠는가??
보통은 세세하게 7단계로 네트워크를 구분해 놓는다.
컴퓨터 관련 자격증에 항상 나오는 것이니(아직까지 내 경험엔..;;) 외워두자
이 책에서는

응용 -> TCP/UDP -> IP -> LINK

로 간단하게 구분해 놨다.

다음은 TCP/IP 프로토콜 탄생 배경인데.........
귀찮으니 걍 검색해서 보자.(보는 사람도 없는데 뭐 ㅡㅜ)

TCP 방식의 서버 쪽 흐름을 간략하게 보자

소켓 생성->소켓 주소할당->연결요청 대기상태->연결허용->데이터 송수신->연결종료

이 순으로 만들어 볼꺼다.
서버는 "연결요청 대기상태"가 있다. 이걸 대기 시킨다는 것은 클라이언트가 연결요청을 수락할 때까지 연결요청 자체를 기다리게 하는 곳이 있다는 것이다.
이것을 우아하게(?) 표현하면 "연결요청 대기 큐"라고 한다

소스코드를 보자.(일부분만 볼꺼다)

int main(int argc, char *argv[])
{
int serv_sock, clnt_sock;
char message[BUF_SIZE];
int str_len, i;

struct sockaddr_in serv_adr;
struct sockaddr_in clnt_adr;
socklen_t clnt_adr_sz;

if(argc!=2) {
printf("Usage : %s <port>\n", argv[0]);
exit(1);
}
//소켓생성
serv_sock=socket(PF_INET, SOCK_STREAM, 0);   
if(serv_sock==-1)
error_handling("socket() error");
//구조체 변수 초기화
memset(&serv_adr, 0, sizeof(serv_adr));
serv_adr.sin_family=AF_INET;
serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_adr.sin_port=htons(atoi(argv[1]));
     
       //소켓 주소 할당
if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1)
error_handling("bind() error");

         //연결요청 대기상태(5번의 클라이언트 연결 요청을 받을 수 있다)
if(listen(serv_sock, 5)==-1)
error_handling("listen() error");

clnt_adr_sz=sizeof(clnt_adr);

for(i=0; i<5; i++)
{
                 //연결허용하고 에러처리까지 한다.
clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);
if(clnt_sock==-1)
error_handling("accept() error");
else
printf("Connected client %d \n", i+1);
         //데이터 송수신
while((str_len=read(clnt_sock, message, BUF_SIZE))!=0)
write(clnt_sock, message, str_len);
                //현재 접속되어 있는 클라이언트 소켓 연결 종료
close(clnt_sock);
}
        //서버측 소켓 연결 종료
close(serv_sock);
return 0;
}

눈에 확 띄게 색깔로 구분해놨다.이번에는 클라이언트 쪽 소스를 보자
int main(int argc, char *argv[])
{
int sock;
char message[BUF_SIZE];
int str_len;
struct sockaddr_in serv_adr;

if(argc!=3) {
printf("Usage : %s <IP> <port>\n", argv[0]);
exit(1);
}
//소켓생성 , 에러처리
sock=socket(PF_INET, SOCK_STREAM, 0);   
if(sock==-1)
error_handling("socket() error");
//IP/PORT 정보 초기화
memset(&serv_adr, 0, sizeof(serv_adr));
serv_adr.sin_family=AF_INET;
serv_adr.sin_addr.s_addr=inet_addr(argv[1]);
serv_adr.sin_port=htons(atoi(argv[2]));
//서버로 연결요청, 에러처리
if(connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1)
error_handling("connect() error!");
else
puts("Connected...........");

while(1)
{
fputs("Input message(Q to quit): ", stdout);
fgets(message, BUF_SIZE, stdin);
//Q,q를 입력하면 접속이 종료된다
if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))
break;
                //서버에 송신하기
write(sock, message, strlen(message));
                //서버에 수신하기
str_len=read(sock, message, BUF_SIZE-1);
message[str_len]=0;
printf("Message from server: %s", message);
}

close(sock);
return 0;
}

역시 자세한 사항은 소스코드를 다운 받아 보고 직접 해봐야 한다
지금 설명하는 것은 전부 리눅스 기준이다.
윈도우는 19강에서나 본격적으로 할 것이다.

TCP/IP 소켓 프로그래밍 3강

이번 강은 주소체계와 데이터 정렬를 알아볼 것이다.
소켓에는 IP주소와 PORT번호가 할당되어야 한다.
먼저 IP주소의 체계가 뭔지 알아야 할당을 할 것아닌가? (아님 말고 ㅡㅡ;)

지금 우리가 많이 쓰는 주소는 IPv4 다.
이 주소는 4바이트 주소 체계다.
체세대 주소 체계라고 불리는 IPv6는 16바이트 주소체계다.
4바이트가 뭐냐고???
1바이트 = 8비트 다. 즉, 2의 8승개의 숫자를 표현할 수 있다.
2의 8승 = 256이다.
즉 0~255 까지 표현 가능한 숫자를 4개를 쓴다는 것.
보통 IP 주소를 192.168.0.1 이런식으로 쓰지 않는가??

주소 형태에 따라서 a~e 클래스로 분류를 한다.
이건 아래 표를 보고 이해하면 된다(위키에서 퍼왔다)

여기서 E 클래서는 일반적이 아닌 예약되어 있는 전용 IP라서 쓰지 못한다고 한다.
어디에 예약 되어 있는지는 모름...;;
자~ 일단 IP주소의 체계는 알았으니

PORT를 알아보자. 이놈은 뭐하는 놈일까??
IP가 집 주소라면, PORT는 각 방에 있는 문이라고 생각하면 된다.
누구는 화장실 문으로, 도둑은 창문으로, 택배 아저씨는 현관문으로, 음식은 냉장고 문으로
들어오고 나가지 않는가?
이렇게 각자의 필요에 의해서 문을 만들어 쓰는 것이 PORT로 생각하면 편하다.

우리는 보통 동시에 여러 인터넷을 사용한다.
토렌트를 다운 받으면서, 인터넷 서핑을 하며, 음악 스트리밍을 듣는다.
이걸 한개의 소켓으로 해결하려고 하면 인터넷이 엄청 빠르지 않는한 분명 충돌이 나고 난리가 날 것이다.
이걸 아예 나눠서 전용 PORT를 만들어서 따로따로 받으면 충돌도 안나고 동시에 여러 작업이 수월하게 될 것이다.

PORT번호는 16비트로 표현되기에 범위가 0~65536 까지다.
이 범위에서 얼마든지 내가 할당해서 쓰면 된다.
그리고 주의할 점은 포트는 중복해서 할당하면 충돌이 일어나기에 따로따로 할당해야 한다.
0~1023번까지는 os에서 주로 쓰는 번호가 있기에
개인적으로 포트를 열어서 쓰려면 그 이상부터 할당해서 쓰는 것이 좋다.

또한 TCP 소켓을 생성할 때 20000 번을 할당했다면 다른 TCP 소켓에서는 20000번은 피해서 할당해야 하지만, UDP 소켓은 할당 할 수 있다.
체계 자체가 다르기 때문이다.
하지만 그것도 문제가 생길 수도 있으니 걍 포트는 다 피해서 할당하자 ㅡ.ㅡ

IP와 PORT의 주소체계를 간단히 알아봤으니 이걸 할당하는 구조체를 살펴보자

struct sockaddr_in
{
     sa_family_t             sin_family;    //주소체계
     uint16_t                 sin_port;       //16비트 TCP/UDP PORT번호
     struct in_addr         sin_addr;      //32비트 IP 주소
     char                      sin_zero[8];  //사용되지 않음
}

이번에는 바이트 순서와 네트워크 바이트 순서를 알아보자.
CPU가 데이터를 메모리에 저장하는 방식은 크게 두가지가 있다.

빅 엔디안 - 상위 바이트 값을 작은 번지수에 저장하는 방식
리틀 엔디안 - 상위 바이트 값을 큰 번지수에 저장하는 방식

라고 쓰여있는데 이게 뭔 x소리야~! 할 것 같아서 예를 들어본다

12345678를 저장하는데
12 34 56 78 로 저장하는 방식은 빅 엔디안 바이트 표현

78 56 34 12 로 저장하는 방식은 리틀 엔디안 바이트 표현이다.

어떤 미친 xx들이 리틀 엔디안으로 저장하냐고 버럭했는데 인텔 계열 CPU가 저리 저장한다고 했다....;;(내 컴도 인텔...)

이래서 네트워크 상에 데이터를 주고 받을 때 통일된 방법이 필요했다
그래서 "빅 엔디안" 방식으로 통일하기로 합의를 했다.(내가 봐도 당연하다)

그래서 네트워크로 데이터를 보내려면 빅 엔디안으로 변환을 해서 보내야 한다
(인텔이 리틀 엔디안을 포기해!!!!!)

하여간 xxx들 때문에 쓸데없이 변환하는 것도 배워야 한다 ㅡㅡ
바이트 순서의 변환을 돕는 함수를 보자.

unsigned short htons(unsigned short);
unsigned short ntohs(unsigned short);
unsigned long htonl(unsigned long);
unsigned long ntohl(unsigned long);

이게 뭔가 하지만 나름 패턴이 있는 이름이다.
htons는 h는 호스트 바이트 순서, n는 네트워크 바이트 순서다
이걸 해석하면(?) 데이터를 호스트(h) to 네트워크(n)를 short형(s)으로 변환해라!

위에는 말로 쓰여있으니 코드로 정리해서 보자
인터넷 주소의 초기화 코드

struct sockaddr_in addr;
char *serv_ip = "192.168.0.1";   //IP주소 문자열 선언
char *serv_port = "9190";          //PORT번호 문자열 선언
memset(&addr, 0, sizeof(addr)); //구조체 변수 addr의 모든 멤버 0으로 초기화
addr.sin_family = AF_INET;        //주소체계 지정
addr.sin_addr.s_addr = inet_addr(serv_ip); //문자열 기반의 IP주소 초기화
addr.sin_port = htons(atoi(serv_port));      //문자열 기반의 PORT번호 초기화

하지만 맨날 이렇게 초기화 하면 빡칠 수가(?) 있기 때문에 아래와 같이 바꿀 수 있다.

struct sockaddr_in addr;
char *serv_port = "9190";          //PORT번호 문자열 선언
memset(&addr, 0, sizeof(addr)); //구조체 변수 addr의 모든 멤버 0으로 초기화
addr.sin_family = AF_INET;        //주소체계 지정
addr.sin_addr.s_addr = inet_addr(INADDR_ANY); //문자열 기반의 IP주소 초기화
addr.sin_port = htons(atoi(serv_port));      //문자열 기반의 PORT번호 초기화

파란부분처럼 서버의 IP주소를 상수화해서 초기화 하면 편하다.

역시 이것도 3강 소스를 다운 받아서 직접 해보자.
소스 코드 다운 받기 

4강은 TCP 기반 서버와 클라이언트를 해보자.

TCP/IP 소켓 프로그래밍 2강

이번에는 소켓의 타입과 프로토콜의 설정하는 법을 알아보고자 한다.
일단 프로토콜이란 무엇일까??
세상에는 수많은 컴퓨터가 있고 수많은 os가 존재한다.
이런 것이 서로 통신을 하려면 서로 약속을 해야한다.
이 통신 약속이 프로토콜이다.

처음에 소켓을 쓰려면 소켓을 생성해야했다.
이번 강에는 이 소켓 함수를 세세하게 뜯어볼려고 한다.(물론 내가 뜯어본건 아니다..;;)

소켓 생성 함수는 다음과 같다.

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

domain - 소켓이 사용할 프로토콜 체계 정보 전달.
type  - 소켓의 데이터 전송방식에 대한 정보 전달.
protocol - 두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달.

프로토콜의 종류(Protocol)
소켓에서 사용할 프로토콜의 종류는 다음과 같다

PF_INET - IPv4 인터넷 프로토콜 체계
PF_INET6 - IPv6 인터넷 프로토콜 체계
PF_LOCAL - 로컬 통신을 위한 UNIX 프로토콜 체계
PF_PACKET - Low Level 소켓을 위한 프로토콜 체계
PF_IPX - IPX 노벨 프로토콜 체계

이중 PF_INET 를 주로 쓴다. 현재까지는...
IPv6로 바뀌면 그걸로 바꿔서 소켓 생성하면 된다.

소켓의타입(Type)
소켓의 데이터 전송 방식을 의미한다.

SOCK_STREAM - 연결지향형 소켓
SOCK_DGRAM - 비 연결지향형 소켓

연결지향형 소켓은 다음과 같은 특징이 있다.
1. 중간에 데이터가 소멸되지 않고 목적지로 전송된다.
2. 전송 순서대로 데이터가 수신된다.
3. 전송되는 데이터의 경계가 존재하지 않는다.

비 연결지향형 소켓은 다음과 같은 특징이 있다.
1. 전송 순서에 상관없이 가장 빠른 전송을 지향한다.
2. 전송된 데이터는 손실의 우려가 있고, 파손의 우려가 있다.
3. 전송되는 데이터의 경계가 존재한다.
4. 한번에 전송할 수 있는 데이터의 크기가 제한된다.

연결지향성 소켓을 TCP방식이라고 하고, 비 연결지향성 소켓을 UDP 방식이라고 한다.

TCP 소켓을 생성하는 예제
int tcp_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

UDP 소켓을 생성하는 예제
int udo_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

다음은 예제인데 이것도 예제를 다운 받아 직접 실행시켜가며 해보자 -_-;

다음 3강은 주소체계와 데이터 정렬을 알아볼 것이다~

TCP/IP 소켓 프로그래밍 1강

소켓 프로그래밍이라고 하면 좀 생소하니깐
네트워크 프로그래밍이라고 하자.

네트워크가 뭔지는 대부분 알 것이다.
컴퓨터와 컴퓨터를 연결하는 것이당@.@;
전세계에는 수없이 많은 컴퓨터가 존재하는데 그걸 어찌 알고 데이터가 착착 갈까??
그럼 내 컴에 고유 주소가 있어야 하지 않겠는가??
주소가 있다고 해도, 이게 택배인지, 우편인지, 전화인지, 우유인지 구분하는 것이 있어야 한다
위의 예가 적절한지는 모르겠지만.
주소가 IP고, 어떤 물건(?)인지 구분하는 것이 PORT다.

근데 컴퓨터, 각종 망, 속도, os가 다 다르다
이걸 프로그래머가 하나하나 다 만들어서 연결하려고 하면 죄다 개발 때려칠지도 모른다..;;
그래서 표준을 지정하고 그것만 가져다 쓰면
연결, 데이터 전송, 연결해제 까지 가능하게 만들었다.
이것이 바로 소켓이다~!

소켓에서 쓰이는 함수를 나열해 보겠다.(서버 측)

1. 소켓을 생성하는 함수다. 소켓을 쓰겠다는 명령이다.
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

2. 소켓에 주소 정보를 할당하는 함수다.
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);

3. 소켓을 연결 요청이 가능한 상태로 만드는 함수(서버에서 사용)
#include <sys/socket.h>
int listen(int sockfd, int backlog);

4. 클라이언트에서 연결 요청이 들어오면 그것을 수락하는 함수
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

이걸 단계별로 나열해보면...
1단계. 소켓 생성
2단계. IP주소와 PORT번호 할당
3단계. 연결요청 가능상태로 변경
4단계. 연결요청에 대한 수락

이번에는 클라이언트 측에서 쓰는 함수를 나열해보겠다.

1. 소켓을 생성하는 함수다. 소켓을 쓰겠다는 명령이다.
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

2. 연결 요청하는 함수. 서버에 연결이 가능한지 물어보는 함수다
#include <sys/socket.h>
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen);


클라이언트에서 쓰는 함수는 이게 다다...;;
그와중에 1번은 서버와 같다 ㅎㅎ;
이걸 서버와 클라이언트로 통합해서 표현해보자면

1. 서버가 소켓을 생성한다.
2. 서버의 IP 주소와 PORT 번호를 할당한다
3. 서버를 연결 요청 가능한 상태로 변경하고 연결 요청이 올 때까지 기둘린다.

4. 클라이언트가 서버에게 연결 요청을 한다.
5. 서버가 연결 요청에 대한 수락을 한다.

6. 데이터를 주고 받고, 할 일을 쭉 한다.
7. 클라이언트 소켓 연결을 끊는다.
8. 서버 소켓 연결을 끊는다.

아직 6,7,8 은 나오지 않았다.이건 다음 강에 표현하겠다.

소스를 이곳에 붙여 넣고 싶지만 내용이 길어지니
소스 코드를 다운 받아 쓰길 바란다.
소스 코드 받으러 가기

이번 1강은 그야말로 전체적인 맥락을 짚는 강이였다.
다음 2강은 소켓의 타입과 프로토콜의 설정을 알아보자.

2014년 12월 7일 일요일

TCP/IP 소켓 프로그래밍 0강

후아~ 오래만에 글을 써본다.
올해는 그야말로 건강 치료의 해인거 같다 ㅡㅡ;
맨날 허리치료 다니고, 간약도 먹고....;;
TCP/IP 소켓 프로그래밍은 맨날 공부해야지 해야지 하면서 계속 미루었다....;
그러다가 연초에 다녔던 회사에서 갑자기 소켓 프로그래밍을 하게 되면서
멘붕에 빠진 경험이 있어서 정식(?)으로 공부할려고 한다.

일단 교제는 "윤성우 열혈 TCP/IP 소켓 프로그래밍" 이다.
이 책은 좋은게 책을 사면 12개월동안 무료 강의를 들을 수 있다.
또 좋은 점은 리눅스와 윈도우에서의 소켓 프로그래밍을 가르친다는 것이다.

보통 한쪽만 가르치는데 이 책은 둘 다 강의한다.
파트는 4개로 구분 되어 있다.

1파트 - 네트워크 프로그래밍의 전체적인 설명
2파트 - 리눅스 기반 프로그래밍
3파트 - 윈도우 기반 프로그래밍
4파트 - 네트워크 프로그래밍 마무으리~!

리눅스 기반으로 주로 설명하고 뒤에는 윈도우에서 변경점만 알려주는 방식이라
리눅스를 먼저 설치를 해야한다.
본인은 vm 플레이어를 설치하고 우분투를 설치했다.

vm 웨어 플레이어 다운 받기
우분투 다운 받기

만약 CPU가 가상화를 지원하는 CPU라면 바이오스에서 활성화 하고 vm웨어로 설치하면
64비트 우분투도 설치가 가능하다.(내가 이걸 몰라서 한참 헤맴 ㅡㅡ;)
64비트 우분투를 쓰면 2기가 이상의 램도 인식하기 때문에 적극 추천한다.

멀티 부팅으로 깔아도 되는데 이렇게 한 이유는
무료 강좌가 윈도우 미디어 플레이어를 필요로 하기 때문에
윈도우에서 강의를 들어가며 실습하려면 어쩔수 없다....;;

프로그램 언어는 C를 사용한다.
사용 툴은 코드블락을 사용했다.
컴파일러는 GCC를 사용했다.
우분투를 설치하면 우분투 소프트웨어 센터를 사용할 수 있다.
GCC 컴파일러와 코드블락을 다운 받아 설치하면 사용가능하다.
실행은 ssh나 터미널을 통해서 실행해야한다.
소켓 프로그래밍은 서버측, 클라이언트측 2개의 소프트웨어가 필요하기 때문에
최소 2개의 터미널을 띄우고 실행시켜야 한다.
(내가 이걸 몰라서 하나에서 할려고 했으니 될리가 있나....;;;)

윈도우에서는 이클립스, 코드블락, 넷빈즈, vs 등등 사용하면 된다.
그리고 윈도우에서 사용하려면 한가지를 해줘야 한다.
ws2_32.lib 라이브러리를 링크 시켜줘야 한다.
그 방법은 아래를 보자.
vs 2013 기준이다.
프로젝트 -> 속성을 누르면 아래창이 뜬다.
구성 속성 ->링커 -> 입력-> 추가 종속성에서


ws2_32.lib를 쓰고 확인 누르면 준비가 완료 된다.


리눅스에서 프로그래밍할 때는 이런 과정이 필요 없다.(리눅스 만세~!)

이로써 소켓 프로그래밍을 공부할 준비가 끝났다.
다음은 네트워크 프로그래밍과 소켓의 이해라는 제목으로 시작해보자~!

2014년 9월 16일 화요일

후아~~ 진짜 오랜만에 접속해본다

6월 이후에는 아무런 글을 안썼네 ㅡㅡ;;
전자계산기 조직응용기사 공부하느라 그렇게 되었다

현재는 필기는 합격한 상태~ 잇힝~
10/5일에는 필답형
10/12일에는 작업형 실기를 볼 예정이라 공부중이다

전자계산기 조직응용기사(헉헉 뭔 이름이 이리 길어) 실기 공부도 하지만

뇌를 자극하는 자바도 공부하고 있다. 이 글을 쓰는 시점에 22강 중 3강 공부중이다 -_-;
이것 역시 공부를 다 마치고 나면 이 곳에 복습(?)차원에서 정리해서 올릴 예정이다
전에는 헤드퍼스트 시리즈로 공부했지만 요즘은 C 이후로 나오질 않아서
뇌자극 시리즈로 공부하고 있다.
뇌자극 시리즈도 나에게 잘 맞는 책이다.

자바는 예전에 공부했던 언어인데 한국에서는 유난히도 자바를 많이 해서 다시 공부하고 있다
허리는 많이 나아진 상태고 곧 다시 재취업을 할 예정이다.
일단은 자격증 시험이 끝나야 이력서를 내던지 말던지 할 것 같다

납땜은 많이 익숙해졌으나 아직 패턴도 그리기가 익숙하지 않아서 필답에 올인(?)해보려고 한다.
필답이 60점 이상 넘으면 작업형은 0점 맞아도 합격이기 때문이다.
그래도 혹시 모르니 작업형은 2번 연습해봤다.
작업형 연습하는 것도 한계가 있는 이유가 각 하드웨어 부품을 사야하기 때문이다
회로 기판이 은근히 비싸다 ㅡㅡ;;(3천~5천 사이)
그리고 허리 때문에 오래 작업을 하지 못한다는 단점이 있다
책으로 하는 공부는 침대에 엎드려서 하고 있고
예제로 공부할 때만 컴퓨터를 켜서 하고 있다.

에고~ 일하다가 허리가 악화된 것이라.....
개발자의 길을 계속 가야 하는 의구심이 들었었다.
그리고 이왕 시작한 것이기에 기술사 자격증이 가능한 경력까지는 버텨보려고 한다
그리고 나서 진로를 바꿀지 말지 하기로 했다.

지금 따려는 자격증 순서가

전자계산기조직응용기사 -> 보안기사 ->  공인중개사 -> 기술사
이다.
공인중개사를 따려는 이유는 내가 나중에 하려는 것도 있지만
부동산에 대해 공부할 수 있는 기회라고 생각하기 때문이다.

그럼 최근 근황을 여기서 마침~ ㅋㅋ