인터넷 주소(Internet Adress)
 - IPv4(Internet Protocol version 4) : 4바이트 주소체계(1234.1234.1234.1234)
 - IPv6(Internet Protocol version 6) : 16바이트 주소체계(1234.1234.1234.1234.1234.1234.1234.1234)
                                                         : IPv4의 IP주소가 모두 고갈될 것을 염려하여 만들었다.


IPv4기반의 주소표현을 위한 구조체
struct sockaddr_in
{
  sa_family_t      sin_family;    // 주소체계(Adress Family)
  uint16_t           sin_port;      // 16비트 TCP/UDP PORT번호
  struct in_addr  sin_addr;     // 32비트 IP주소
  char               sin_zero[8] // 사용되지 않음
};

struct in_addr
{
  in_addr_t  s_addr; //32비트 IPv4 인터넷 주소
};

 - 구조체 분석
멤버 변수
  sin_family
->프로토콜체계마다 적용하는 주소체계가 다르다. 예를 들어서 IPv4에서는 4바이트 주소체계를 사용하고 IPv6에서는 16비트 주소체계를 사용해야 한다.
->AF_INET    : IPv4 인터넷 프로토콜에 적용하는 주소체계(AF = Adress Family)
->AF_INET6   : IPv6 인터넷 프로토콜에 적용하는 주소체계
->AF_LOCAL : 로컬 통신을 위한 유닉스 프로토콜의 주소체계
  sin_port
->소켓의 구분에 활용되는 것이 바로 Port번호이다. IP만 있다면 목적지 컴퓨터로 데이터를 전송할 순 있어도 해당 응용프로그램까지 전송할 수는 없지 않은가?
->16비트의 PORT번호를 저장하는 변수이다. 단, '네트워크 바이트 순서'로 저장해야 한다(이것은 아래에 추가 설명을 해놓을 것입니다.),
  sin_addr
-> 32비트 IP주소를 저장한다. 이것 역시 '네트워크 바이트 순서'로 저장해야 한다.
  sin_zero
-> 단순히 구조체 sockaddr_in와 크기를 맞추기 위해 존재하는 변수이다. 반드시 0으로 초기화해주어야 한다.


struct sockaddr
{
  sa_family_t  sin_family;      // 주소체계(Address Family)
  char           sa_data[14];  // 주소정보
};
멤버변수
  sa_data[14]
->IP주소와 PORT번호를 담고 있어야 하고, 남은 부분은 0으로 채울것을 bind함수는 요구하고 있다. 그렇기 때문에 sockaddr_in이라는 구조체가 필요한 것이다.



네트워크 바이트 순서와 인터넷 주소 변환
CPU에 따라서 4바이트 메모리 공간에 정수 1을 저장하는 방식이 달라진다.
00000000 00000000 00000000 00000001   -> 빅엔디안    : 상위 바이트의 값을 작은 번지수에 저장하는 방식
00000001 00000000 00000000 00000000   -> 리틀엔디안 : 상위 바이트의 값을 큰 번지수에 저장하는 방식

0x12345678이라는 데이터를 전송할 경우
빅엔디안 ------------------------------------> 리틀 엔디안
   송신       0x78  ->  0x56  ->  0x34  ->  0x12            수신
0x12345678                                                        0x78563412

그래서 결국 빅엔디안 방식으로 통일하기로 약속을 하였다.


바이트 순서의 변환
 - unsigned short htons(unsigned short);
 - unsigned short ntohs(unsigned short);
 - unsigned long htonl(unsigned long);
 - unsigned long ntohl(unsigned long);
 여기서 h는 호스트(host)바이트 순서를 의미하고, n은 네트워크(network)바이트 순서를 의미한다.
 그리고 s는 short형을 의미하고, l은 long형을 의미한다.(to는 영어 to를 뜻함)
 그렇다면 이것을 가지고 위의 함수들을 해석하면 이렇게 된다.

 - unsigned short htons(unsigned short); short형 데이터를 호스트바이트 순서에서 네트워크바이트 순서로 변환해라.
 - unsigned short ntohs(unsigned short); short형 데이터를 네트워크바이트 순서에서 호스트바이트 순서로 변환해라.
 - unsigned long htonl(unsigned long); long형 데이터를 호스트바이트 순서에서 네트워크바이트 순서로 변환해라.
 - unsigned long ntohl(unsigned long); long형 데이터를 네트워크바이트 순서에서 호스트바이트 순서로 변환해라.



 sockaddr_in server;
 memset(&server,0,sizeof(server));
 server.sin_family = AF_INET;
 server.sin_port = htons(10000);
 server.sin_addr.S_un.S_addr = htonl(ADDR_ANY);
 bind(m_hServer, (sockaddr*)&server, sizeof(server));

 sockaddr_in client;
 memset(&client,0,sizeof(client));
 client.sin_addr.s_addr = inet_addr(IP);
 client.sin_family = AF_INET;
 client.sin_port = htons(Port);
 connect(m_hClient, (sockaddr*)&client, sizeof(client));

여태까지 배운것들이 이 12줄을 위해 배운거랍니다. 하하하;;;

프로토콜이란?
 - 멀리 떨어져 있는 두 사람이 대화를 주고받기 위해서는 나름의 대화방법을 결정해야 하는데, 여기서 결정하는 대화방법을 프로토콜이라고 한다. 즉, '컴퓨터 상호간의 통신에 필요한 규약.'이라고 할 수 있다.


SOCKET socket(int af, int type, int protocol);
 - af(linux에선 domain) : 소켓이 사용할 프로토콜 체계(Protocol Family) 정보 전달.
 - type                        : 소켓의 데이터 전송방식에 대한 정보 전달.
 - protocol                  : 두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달.


프로토콜 체계(첫 번째 인자값)
 - PF_INET       : IPv4 인터넷 프로토콜 체계
 - PF_INET6     : IPv6 인터넷 프로토콜 체계
 - PF_LOCAL   : 로컬 통신을 위한 UNIX 프로토콜 체계
 - PF_PACKET : Low Level 소켓을 위한 프로토콜 체계
 - PF_IPX         : IPX 노벨 프로토콜 체계


소켓의 타입(두 번째 인자값)
 - SOCK_STREAM(연결지향형 소켓)
      - 특징 : 중간에 데이터가 소멸되지 않고 목적지로 전송된다.
                : 전송 순서대로 데이터가 수신된다.
                : 전송되는 데이터의 경계(Boundary)가 존재하지 않는다.
      - 신뢰성 있는 순차적인 바이트 기반의 연결지향 데이터 전송 방식의 소켓

 - SOCK_DRAM(비 연결지향형 소켓) : 
      - 특징 : 전송된 데이터는 손실의 우려가 있고, 파손의 우려가 있다.
                : 전송되는 데이터의 경계(Boundary)가 존재한다.
                : 한번에 전송할 수 있는 데이터의 크기가 제한된다.
      - 신뢰성과 순차적 데이터 전송을 보장하지 않는 고속의 데이터 전송을 목표로 하는 소켓


프로토콜(세 번째 인자값)
 솔직히 첫번째와 두번째 인자값만으로도 충분히 우리가 원하는 유형의 소켓을 만들 수 있다. 그렇기 때문에 이 인자값에 0을 넣어주어도 상관이 없다. 하지만 한 가지 예외가 생긴다. 그 예외가 바로 하나의 프로토콜 체계 안에 데이터의 전송방식이 동일한 프로토콜이 둘 이상 존재하는 경우가 생길지도 모른다는 것이다. 그것을 구분해 주는 것이 바로 아래의 인자값들이다.
 - IPPROTO_TCP : 연결지향형 데이터 소켓.
 - IPPROTO_UDP : 비연결지향형 데이터 소켓.




#include<winsock2.h>
#pragma comment(lib, "ws2_32.lib")

SOCKET socket(int af, int type, int protocol);
 - 소켓을 생성해주는 함수.
매개변수
af          : 소켓이 사용할 프로토콜 체계(Protocol Familiy)정보 전달.
type       : 소켓의 데이터 전송방식에 대한 정보 전달.
proTocol : 두 컴퓨터 간 통신에 사용되는 프로토콜 정보 전달.
반환값
 - 성공 시 소켓 핸들, 실패 시 INVALID_SOCKET 반환


int bind(SOCKET s, const struct sockaddr *name, int namelen);
 - IP주소와 PORT번호 할당을 목적으로 하는 함수.
매개변수
s           : IP주소와 PORT번호를 할당받을 소켓을 전달.
name     :
namelen : name의 크기를 전달.
반환값
 - 성공 시 소켓 핸들, 실패 시 INVALID_SOCKET 반환


int listen(SOCKET s, int backlog);
 - 클라이언트 프로그램의 연결 요청을 받아들일 수 있는 상태가 되게 해주는 함수
매개변수
s          : 서버 소켓을 전달.
backlog : 연결을 기다리는 소켓들의 최대 크기를 전달.(보통은 SOMAXCONN를 넣어주네요.)
반환값
 - 성공 시 0, 실패 시 SOCKET_ERROR반환


SOCKET accept(SOCKET s, struct sockaddr *addr, int *addrlen);
 - 클라이언트 프로그램에서의 연결요청을 수락해주는 함수
매개변수
s          : 서버소켓 전달.
addr     : 서버의 자세한 설정을 전달.
addrlen : addr의 크기를 전달.
반환값
 - 성공 시 소켓 핸들, 실패시 INVALID_SOCKET 반환


int connect(SOCKET s, const struct sockaddr* name, int namelen);
 - 클라이언트가 서버에게 연결을 요청하는 함수.
매개변수
s           : 연결할 소켓 전달.
name     : 클라이언트의 자세한 설정을 전달.
namelen : name의 크기를 전달.
반환값
 - 성공 시 0, 실패 시 SOCKET_ERROR 반환


int closesocket(SOCKET s);
 - 소켓을 종료하는 함수.
매개변수
s : 종료하고 싶은 소켓 전달.
반환값
 - 성공 시 0, 실패 시 SOCKET_ERROR 반환

페도라 리눅스를 방금 막 설치한 유저라면 아마 GUI에서 작업중이실겁니다.
하지만 VMWare를 사용하다보니 GUI환경이라 그런지 Linux가 조금 느린것 같네 싶은 사람들에게 추천하는 CUI환경으로 바꾸는 방법입니다.




아래는 보이는 사진은 터미널 프롬프트를 킨 페도라 리눅스 화면입니다. 아직 GUI환경이지요.





su - root는 관리자권한으로 로그인 하는 것입니다. password는 자신이 등록한 password입니다.





Password를 입력하면 아래와같이 [root@localhost ~]라고 나와있고, 옆에 명령어를 입력할 수 있게 되어있습니다.





그 명령어 창에 vi /etc/inittab을 입력해주세요.
vi는 파일편집기 같은 것입니다.
/etc/inittab은 디렉토리구요.





그러면 이런 신기한 글들이 마구 뜰겁니다.
거기서 키보드의 i를 누르시면...
아래 그림의 맨 아래를 보시면 -- INSERT --라고 바뀔것입니다.
파일을 수정하겠다는 뜻입니다.





아래의 그림처럼  맨 아래의 id:5:initdefault:라는 부분을 id:3:initdefault:로 바꿔주세요.그리고 ESC를 사뿐히 눌러줍니다.





--INSERT--사라진거 보이시죠?






이제 그 창에 :wq를 입력하고 Enter를 눌러주세요.
w는 write의 약자로써 저장을 하겠다는 뜻이고,
q는 quit의 약자로써 종료를 하겠다는 뜻입니다.
즉, '저장하고 종료하겠다'라는 뜻입니다.
참고로 !를 붙여주면 무조건 하겠다는 뜻으로 오류도 무시한다는 뜻입니다. :q! 무조건 종료해라.





그러면 아래처럼 깔끔하게 원래 창으로 돌아옵니다!!
거기서 reboot명령어를 써서 재부팅~!@





하면 아래 도스창같은 창이 뜹니다. 옛날의 CUI죠...
localhost login에 호스트 명을 입력해주시고,





Password는 아시겠죠? 말그대로 비밀번호입니다.





그러면 아무것도 없이 터미널 프롬프트에서만 보던 것이 뜹니다.
이렇게 해놓으면 멋은 없지만..(ㅜ;;) 하면 훨씬 빨라집니다!!




mysql은 질의어인 sql(Structured Query Langauge)을 다루는 프로그램이고,
gcc는 리눅스기반의 c컴파일러입니다.

yum명령어
 - yum이란 온라인 저장소에서 업데이트 된 패키지들을 검사하고, 다운로드하여 설치까지 처리해주는 텍스트 기반의 업데이트 명령어입니다. 다운받아 설치해주는 툴이라고 요약할수 있습니다.

사용법
패키지 찾기
 # yum list available         설치가 가능한 패키지 목폭
 # yum list installed          이미 설치된 list 패키지 목록
 # yum list extras             일반 저장소에서 설치되지 않는 패키지 목록
 # yum list *vorbis*          'vorbis'타이틀이 있는 패키지 목록
 # yum list updates          업데이트 가능한 패키지 목록
 # yum info wordpress     wordpress패키지에 대한 설명
 # yum info word*            word로 시작되는 패키지 설명
 # yum search mp3          mp3문자열을 포함한 패키지의 검색
 # yum whatprovides ??    파일 또는 다른 형태의 패키지를 검색
패키지 설치
 # yum install XFCE                XFCE 패키지 다운로드 인스톨
 # yum groundinstall XFCE      XFCE 데스크톱 패키지의 전체 세트를 다운로드 인스톨
패키지 업데이트
 # yum check-update                 업데이트가 준비된 모든 패키지를 리스트한다.
 # yum list update openoffice*     openoffice*이름으로 이용 가능한 업데이트를 찾는다.
 # yum update openoffice*          모든 openoffice 패키지를 업데이트 한다.
 # yum update                           업데이트가 준비된 모든 패키지를 업데이트한다.
 # yum groupupdate XFCE          파일명 그룹의 모든 패키지를 업데이트한다.
패키지 제거하기
 # yum remove beagle                beagle 패키지를 제거한다.
 # yum remove xscreen*             xscreen으로 시작되고 있는 패키지를 제거한다.
 # yum groupremove 파일명         XFCE 그룹에서 모든 패키지를 제거한다.
패키지 지우기
 # yum clean packages              cache에서 패키지를 지운다.
 # yum clean metadata               cach에서 metadata를 지운다.
 # yum clean headers                cach에서 header를 지운다.
 # yum clean all                        cach에서 metadata, header, package를 지운다.

mysql설치
터미널 프롬프트 창에
# yum install mysql-server
# yum install mysql
# yum install mysql-devel
이렇게 입력 하면 됩니다.

gcc설치
터미널 프롬프트 창에
$ yum install gcc
이렇게 입력하면 됩니다.

설치 도중 Is this OK?(y/N)라고 질문하는데
y라고 답해주면 인스톨이 시작됩니다.

참고
rpm명령어
 - rpm이란 로컬 시스템(하드디스크 또는 CD/DVD)으로부터 이용할 수 있는 RPM 패키지를 설치 하기 위해 사용하는 명령어 입니다.

사람들은 주로 yum을 즐겨쓴답니다.


관계형 데이터베이스

 - 관계형 데이터베이스(Relational - Database) 시스템은 가장 대표적인 데이터베이스 시스템으로써 성공적인 데이터 모델이 되었습니다. 이렇게 된 이유에는 다음과 같은 몇 가지 특징이 있었기 때문입니다.



첫째, 2차원 구조의 모델을 기반으로 한다.
 - 기존 파일 시스템은 계층적인 수직적 구조를 가진 반면 관계형 모델은 수평적 구조이며 2차원적인 구조입니다. 우리가 많이 사용하는 엑셀 시트가 2차원적 구조의 대표적인 예입니다. 이러한 구조는 컴퓨터가 등장하기 훨씬 전인 종이에 기록하는 시대부터 많이 사용되어 왔고, 그만큼 누구에게나 친숙하고 이해하기 쉬운 구조라 할 수 있습니다. 관계형 모델은 데이터들을 이러한 2차원적인 구조를 가진 테이블 형태로 저장하는 구조를 기본으로 하고 있습니다.


둘째, 데이터의 무결성(Integrity), 트랜젝션 처리 등 데이터베이스 관리 시스템으로써의 기본적인 기능면에서 뛰어난 성능을 보여주었다.


셋째, 질의어(Query Language)를 사용한 데이터 접근 방법이다.
 - 초기 데이터베이스 모델들은 특정 정보를 검색하려면 해당 정보를 찾아가는 과정과 방법을 모두 개별 어플리케이션으로 구현해야만 했습니다. 따라서 그만큼 어플리케이션에 종속적이며 데이터를 추출하거나 저장하는 등의 작업을 수행할 때 효율성이 떨어지게 되었습니다. 이에 반해 질의어는 일정한 패턴이 있으며 이 패턴에만 맞게 질의하고자 하는 조건들을 나열하면 찾고자 하는 정보를 검색해 줍니다. 즉, 데이터베이스 사용자 입장에서는 개별 어플리케이션에 비해 상대적으로 간단한 질의어만 알고 있으면 원하는 정보를 쉽게 얻을 수 있게 된 것입니다. 이러한 접근법은 누구나 쉽게 데이터베이스의 정보를 검색할 수 있다는 점에서 시장에서 큰 환영을 받았습니다.





객체지향형 데이터베이스
 - 관계형 데이터 모델의 여러 가지 장점들로 인해 관계형 데이터베이스가 만능인 것처럼 생각되었지만 시간이 지나면서 몇 가지 문제들이 발생하였습니다. 기존에 내포하고 있던 문제라기보다는 새로운 요구사항의 발생으로 인한 문제였습니다.
  1990년대 들어오면서 어플리케이션들이 기존에 비해 더 많고 복잡한 처리를 하게 됨에 따라 데이터베이스도 좀 더 복잡한 데이터, 예를 들어 사용자 정의 데이터, 오디오 및 비디오 등의 멀티미디어 데이터 등에 대한 저장 및 과닐의 필요성이 대두되었다. 하지만 기존의 관계형 모델로는 이러한 데이터 타입을 지원하는 것이 어려웠으며, 1980년대 등장한 객체지향(Object Oriented) 기술을 데이터베이스에 접목하려는 시도가 생겨났다.
  사실 객체지향 기술은 데이터베이스가 아닌 프로그래밍 분야에서 시작된 기술이다. 모든 사물을 객체로 보고 이 객체들에 대한 정의와 처리방법을 정의한 기술입니다. 그렇다면 관계형 데이터베이스가 할 수 없었던 기능을 수행하는 객체지향 데이터베이스(Object-oriented Database)는 도대체 어떤 특징을 가지고 있는지 살펴봅시다.


첫째, 사용자가 정의한 사용자 정의 타입을 지원한다.
 - 사용자 정의 타입이란 말 그대로 사용자가 임의로 정의한 데이터 유형을 말하며, 기본형 데이터 타입을 뛰어넘어 다양한 형태의 데이터들을 다룰 수 있게 해준다.


둘째, 비정형 복합 정보의 모델링이 가능하다.
 - 비정형 정보(Unstructured Information)란 일반적인 관계형 데이터베이스에서 지원되는 날짜, 문자, 숫자 등의 데이터들을 일컫는 정형 정보(Structured Information)와는 반대되는 개념으로 멀티미디어, 이메일, 문서 등이 이에 해당된다.


셋째, 객체들 사이의 참조(reference)구조를 이용한 접근이 가능하다.


넷째, 90년대에 등장한 많은 객체지향 프로그래밍 언어들과 객체지향 데이터베이스의 스키마 구조가 유사하다는 점이다.
 - 다시 말하지만 데이터베이스는 그 근원이 프로그래밍 언어에서 나왔으므로 객체지향언어를 사용하는(사실 요즘 거의 대부분이 객체지향 언어입니다.) 개발자들의 입장에서 볼 때, 프로그램에서 사용하는 객체들과 데이터베이스 스키마 구조가 유사하다는 점은 프로그램과 데이터베이스 간에 발생하는 추가적인 변환 처리작업을 할 필요가 없어진다는 점을 의미합니다.





객체관계형 데이터베이스
 - 객체관계형 데이터베이스(Object-relational Database)는 기존의 관꼐형 데이터베이스 시스템들이 객체지향 데이터베이스가 제공하는 기능들 중 장점들만을 선별하여 관계형 모델에 통합한 새로운 개념의 데이터베이스입니다. 이것은 안정적으로 데이터베이스의 기본 기능을 지원하는 관꼐형 모델을 기반으로 하면서 객체지향 모델의 장점을 추가한 것입니다. 관계객체형이 아니라 객체관계형으로 표현되어 객체지향이 기반이라고 생각할 소지가 있지만 오해하지 않았으면 합니다. 아마 알파벳 순서로 나열하다 보니 이런식의 용어가 정의된 것 같다고 생각합니다.
  그러면 객체관계형 데이터베이스는 어떤 특징을 가지고 있을까요? 쉽게 추측할 수 있듯이 관계형 데이터베이스의 특징 모두를 가지면서 객체지향 데이터베이스의 장점을 고스란히 갖고 있을 것입니다. 기존의 관계형 데이터베이스에 추가된 특징들만 대표적으로 나열하면 다음과 같습니다.


첫째, 사용자 정의 타입을 지원한다.


둘째, 참조 타입을 지원한다.
 - 참조(reference) 타입이란 객체들로 이루어진 객체 테이블의 경우, 하나의 레코드가 다른 레코드를 참조할 수 있는 것을 말합니다. 관계형 데이터베이스에서는 다른 레코드와 연관관계를 조인을 통해서만 나타낼 수 있었지만, 객체 관계형은 참조 구조를 사용하여 객체지향이 가진 내비게이션 기반 접은이 가능하게 되었습니다.


셋째, 중첩 테이블을 지원한다.
 - 중첩(nested) 테이블이란 테이블을 구성하는 로우(Row) 자체가 또 다른 테이블로 구성되는 테이블을 말합니다. 이러한 구조는 좀 더 복잡하고 복합적인 정보를 표현하는 것을 가능하게 하였습니다.


넷째, 대단위 객체의 저장, 추출이 가능하게 되었다.
 - 이미지 오디오 및 비디오 등 멀티미디어에서는 기존의 일반적인 정형 데이터들보다는 그 크기가 상대적으로 큽니다. 이러한 데이터 유형을 지원하기 위해 대단위 객체(LOB, Large Object) 타입이 기본 타입으로 지원되었습니다.


마지막으로 객체 간의 상속 관계를 지원하는 것이 가능해졌다.
 - 오라클의 경우 OBJECT타입을 지원함으로써 상속(inheritance) 기능을 구현하고 있습니다.


 구분 관계형 데이터베이스 객체지향 데이터베이스 객체관계형 데이터베이스
 데이터 모델 문자, 숫자, 날짜 등
단순 정보타입만 지원
사용자 정의 타입,
비정형 정보타입 지원
사용자 정의,
비정형 정보타입 지원
 대규모 정보처리 우수 보통 우수
 안전성 우수 보통 우수
 장점 사용하기 쉽고,
편리하며 안정적이다.
복잡한 구조의
정보 모델링 가능
관계형 데이터베이스의 안정성에 객체지향 모델링 장점을 추가
 단점 확장성이 부족,
복합적 정보표현 어려움
기본적인 데이터베이스 기능에 있어 안정성과 성능이 떨어짐   




페도라 리눅스를 실행시키면,



윈도우즈에서는 명령프롬프트와 비슷한 터미널입니다.

bash: mycommand: command not found
터미널에서 나타나는 오류들입니다.
이것들은
ㅁ 사용자가 명령어 이름을 잘못 타이핑 했을 때,
ㅁ 명령어가 여러분이 위치한 경로에 있지 않을 때,
ㅁ 명령어 실행을 위해 root 사용자 권한이 필요할 때,
ㅁ 명령어가 사용자의 컴퓨터에 설치되지 않았을 때,
로 나뉘어 집니다.


그렇다면 명령어를 알아낼 수 있는 방법 없을까요?? 리눅스는 똘똘한 녀석이다보니 명령어를 찾는 명령어도 있습니다.

$ type mount
 - PATH 경로에서 첫 번째 mount 명령을 보여준다.

$ whereis mount
 - mount에 대한 binary, source, man 페이지를 보여준다.

$ locate bash.ps
 - 파일 시스템에서 back.ps가 어디 있는지 찾는다.

$ which umount
 - PATH 경로에 지정된 위치 또는 aliases에서 umount 명령을 찾아준다.

$ rpm -qal |grep umount
 - umount 명령어를 설치된 패키지에서 찾는다.

$ yum whatprovides bzfs
 - bzfs를 bzflag패키지에서 찾는다.




 ※ 기존의 리눅스와 UNIX 문서는 일반적으로 man페이지라고 하는 메뉴얼로 제작되고 있습니다. 약간의 더 세련된 문서 작업은 나중에 info 시스템과 함계 진행되었습니다. 그리고 각 명령어는 자체적으로 help메시지를 항상 보유하고 있습니다.

도움 메시지 사용(--help)

$ls --help | less
 - 뜻    : ls명령어를 위한 도움말을 표시
 - 출력 : Usage: ls [OPTION]...[FILE]...
            List information about the FILEs(the current directory by default).
            Sort entries alphabetically if none of -cftuSUX nor --sort.
            Mandatory arguments to long options are mandatory for short options.
              -a, --all                                  do not hide entries starting with.
              -A, --almost-all                       do not list implied. and...
                   --author                             with -l, print the author of each file
                                                 .
                                                 .
                                                 .
                                                 .

  바로 앞의 출력은 ls 커맨드라인이 어떻게 사용되고, 이용 가능한 옵션에는 무엇이 있는지 리스팅해 준다.

man 페이지의 사용

man페이지란?
- 명령어 도움말 페이지
- 서버 관리시 숙달되지 않은 명령어의 사용법이나 옵션들을 알고자 할 때 사용한다.


사용자가 어떤 단어와 관계가 있는 명령어를 man페이지에서 찾기를 원한다면 man페이지 데이터베이스를 찾아보는 apropos명령어를 사용하면 됩니다. 다음 명령어는 man페이지 NAME라인에서 crontab을 가지는 페이지를 보여줍니다.

$apropos crontab
...
/etc/anacrontab [anacrontab] (5) - configuration file for anacron
crontab                    (1)    - maintain crontab files for individual
                                      users (ISC Cron V4.1)
crontab                    (5)    - tables for driving cron ( ISC Cron V4.1)
crontabs                  (4) - configuration and scripts for running periodical jobs
...

 apropos 출력은 crontab을 포함하는 각 man 페이지 NAME라인을 보여준다. 숫자는 man 페이지에 나타나는 man 페이지 섹션을 보여줍니다.
 whatis명령어는 사용자가 입력한 단어를 포함하는 NAME라인만을 보여주는 방법입니다.

$whatis cat
cat                         (1)     - concatenate files and print on the standard output

 용어로 man페이지를 찾는 가장 쉬운 방법은 man 명령어 다음에 명령어 이름을 적는 것이다. 예를 들면, 다음과 같습니다.

$man find
FIND(1)                                        FIND(1)
NAME
            find - search for files in a directory hierarchy
SYNOPSIS
            find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...][expression]
...

이상과 같이 find 명령어와 관련된 첫 번째 man페이지를 표시합니다. 사용자가 이전의 예에서 보았던 것처럼, 일부 용어는 여러 가지의 man 페이지를 가집니다. 예를 들어, crontab으로 검색을 하게 되면 crontab 명령어와 crontab과 관련된 파일들에 대한 man페이지들이 나타납니다.

Man 페이지들은 여러가지 section별로 구성되어 있습니다.

 섹션
   1          - 일반 사용자 명령어
   2          - 시스템
   3          - 프로그래밍 루틴/라이브러리 함수
   4          - special 파일
   5          - configuration 파일과 파일 형식
   6          - 게임
   7          - 미분류 명령어들
   8          - 관리 명령어와 데몬들

  다음 코드들은 man 명령어에서 유용한 몇가지 옵션을 보여줍니다.
 $man mount -a               Show all man pages related to component
 $man 5 crontab               Show section 5 man page for component
 $man mount -P more       Use more, not less to page through
 $man --path                   List locations of man directories
/user/kerberos/man:/usr/local/share/man:/usr/share/man/en:
/usr/share/man:/usr/X11R6/man:/usr/local/man
 $man -f mount                 Same as the whatis command
 $man -k mount                Same as the apropos command

오랫동안, man 페이지를 표시하고 작동하는 방법들은 발전해 왔습니다. 예를 들면, man페이지를 man2html명령어를 사용하여 웹페이지(HTML)로 전환할 수도 있습니다. 예를 들면, 다음과 같습니다.

$where -m cat
cat: /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
$cd /tmp ; cp/usr/share/man/man1/cat.1.gz .
$gunzip cat.1.gz
$links cat.1.html

 첫 번째 명령은 cat man페이지를 찾습니다. 다음 명령은 그 man페이지를 /tmp 디렉터리에 복사하고 압축을 풉니다. 다음으로 man2html 명령어는 man페이지를 HTML(cat1.html파일)로 변환합니다. 그러고 나서 link(커맨드라인 기반의 웹브라우저)는 shell에서 웹 스타일의 man 페이지를 보여줍니다(link또는 elinks 텍스트 기반의 웹브라우저를 사용하기 위해서는 elinks패키지를 설치할 필요가 있다).




알아두기
$ reboot - 다시 시작
$ poweroff - 종료
입니다.

[윈도우 기반의 서버프로그래밍]

헤더파일
winsock2.h

라이브러리파일
ws2_32.lib

윈도우 기반의 서버프로그래밍에서 서버든 클라이언트든지
저 두가지가 없으면 안됩니다!!!

일단 WSADATA부터 알아볼까요?

typedef struct WSAData
{
 WORD              wVersion;
 WORD              wHighVersion;
 char                 szDescription[WSADESCRIPTION_LEN+1];
 char                 szSystemStatus[WSASYS_STATUS_LEN+1];
 unsigned short  iMaxSockets;
 unsigned short  iMaxUdpDg;
char FAR*          lpVendorInfo;
} WSADATA, FAR *LPWSADATA;

멤버변수

wVersion
 - 윈도우 소켓 버전.

wHighVersion
 - 윈도우 소켓의 가장 높은 버전. 통상적으로 wVersion과 같다.

szDescription
 - 윈도우 소켓 DLL이 관련한 지위 또는 구성정보를 카피하는 NULL로 끝나는 아스키 문자열.

iMaxSockets
 - 하나의 프로세스가 열 수 있는 소켓의 최대 수.

iMaxUdpDg
 - 데이터그램 프로토콜의 최대 바이트 단위.
    예를 들어, 버클리 소켓은 8192 바이트의 제한을 사용한다. 최저는 512.

lpVendorInfo
 - 벤더에 특유의 데이터 structure의 far pointer.


이것이 끝인데 솔직히 모르고 있어도 네트워크 프로그래밍 잘만 된다;;




다음으로 알아볼것은 WSAStartup함수
형태는
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
주로 윈속관련 라이브러리를 초기화하고, 그 데이터를 WSADATA에 넣어줄 때 쓰입니다.

매개변수
wVersionRequested : 프로그래머가 사용할 윈속의 버전정보 전달.
lpWSAData              : WSADATA라는 구조체 변수의 주소 값 전달.

반환값
 - 성공 시 0, 실패 시 0이 아닌 에러코드 값 반환

이렇게 됩니다.
wVersionRequested에는 보통 MAKEWORD라는 함수를 넣는데요

사용법
MAKEWORD(1,2); //주 버전 1, 부 버전 2, 0x0201반환
MAKEWORD(2,2); //주 버전 2, 부 버전 2, 0x0202반환
이렇게 됩니다.

마지막으로 WSACleanup함수입니다.
형태는
int WSACleanup(void); 입니다.
주로 윈속 관련 라이브러리를 해제할 때 사용합니다.

반환값
 - 성공 시 0, 실패 시 SOCKET_ERROR반환


int main()
{
  WSADATA wsaData;
  . . . .
 if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
      Error("WSAStartup() error!");
  . . . .
  WSACleanup();
return 0;
}

맨날 남이 포스팅한것만 보다가 직접 포스팅 해보니까

매우... 힘드네요. 여태까지 저에게 도움을 줬던 포스트들 너무 너무 너무

고맙습니다.ㅜ;;

아무튼 본격적인 Fedora설치 시작할께요.
왼쪽 상단에 보이시는 Favorites에 보면 FedoraServer라고 보이시는 것을 클릭해주세요.



 

그러면 이런 창이 뜨는데 저기 동그라미 쳐져있는 것을 클릭하면 Fedora가 부팅됩니다.

 

그리고 오른쪽 하단에 저것 보이시죠? 저게 바로 CD롬인데 ISO파일이나 CD를 불러오는 버튼입니다.





VMWare가 부팅됩니다.






Log In해주시구요.





Install to Hard Drive보이시죠. 클릭하고 Enter눌러주세요`~






드디어 Install시작 Next~!





언어 설정 Korean으로~





Basic Storage Devices를 선택하고





자신이 설치하고 싶은 HardWare를 선택...




Error메시지입니다. Re Initialize all을 선택해 주세요.





이거 나오기 전에 에러메시지 하나 더 뜨시는 분이 계실텐데 그것도 포맷하겠다고 눌러주심 되요.
HostName적어주시고 Next





시간대 설정해주시고 Next





Password입니다. 적어주시고 Next





사전에 있는 단어라고 쓰고싶음 쓰고 말고싶음 말라는 경고문입니다. Use Anyway눌러주세요.




아.. 여기서부터 쬐끔 어려워지는데요...
Create Custom Layout을 선택하고 Next





이제 파티션입니다. Linux에서는 파티션을 나눌 때, 조금 세밀하게 나눠주어야 하는데요.





Standard Partition하시고 Create





부팅할 때, 필요한 것들을 저장할 Size를 지정해 파일에 담아주는 겁니다.
Mouse Point를 /boot으로 설정해 주시고, File System Type은 ext3, Size는 300~500MB으로 설정해주신 후, OK를 눌러주시면 됩니다.





이번에 설정할 것은 가상메모리입니다. 보통은 아까 설정한 메모리에서 2배정도 설정해주시면 됩니다.





그 후, 설정해주어야 할 것은 사용자가 실제로 쓸 Hardware의 용량입니다.
아래처럼 설정해 주시고, OK를 눌러주세요.





아래처럼 설정된 것들이 보이시죠? Next를 눌러주세요.





Format을 눌러주시구요.





아래같이 설정이 됐다면 Next를 눌러주세요.




설치가 시작됩니다.




이렇게 설치가 끝납니다.

설치 완료 후, 재부팅 해주시구요. 그 다음에 설정해야 하는 것들은 사용자 정의 설정이기 때문에

여러분들이 알아서 체크해주시면 됩니다.


 

바탕화면에서 아래의 아이콘을 찾아서 더블클릭






OK누르시고...





이제 New Virtual Machin을 클릭해줍니다.





그리고 Custom에 체크를 하고 Next






그러면 아래와 같은 창이 뜨는데 Hardware compatibility : 를 Workstation 6.5-7.0으로 다음의 그림과 같이 맞춰줍니다.





그 후 CD를 삽입하여 CD가 있는 드라이브(첫번째에 체크 )를 설정해 주면 됩니다.
iso파일인 경우에는 두번째체크박스인 Installer disc image file(iso)를 체크하고, 경로를 설정해주면 됩니다.(iso다운은 http://fedoraproject.org/get-fedora)에서 받으세요. 불법 아닙니다.)





아래의 체크박스에서 Linux를 선택한 후 Version을 Other Linux 2.6.x kernel로 바꿔줍니다.




Location은 virtual machine설치 장소이고, Virtual machine name은 사용하고 싶은 이름을 설정하여 next를 눌러줍니다.





그 후 processors와 cores per processor를 1로 맞춰주고 next





이것은 Virtual Machine에 사용할 렘입니다. 보통은 256으로 맞추는데 저는 널널하게 512로 맞췄어요. 자신의 렘 성능에 맞게 써주세요;;




2번째 체크박스 클릭하고 next





LSI Logic(Recommended)선택





Create a new virtual disk 선택





SCSI(Recommended)선택하고





이곳은 virtual machine의 harddisk를 설정하는 부분 맨위의 칸에 원하는 gb를 설정한다.





HardDisk로 쓸 vmdk확장자의 이름을 정해주는 곳. next~!





이제 거의 끝났군요;;





완료됐을 때의 화면입니다.





이제 VirtualMachine의 성능을 업그레이드 하는 법과 다운그레이드 하는 법입니다.
먼저 렘부터. 아래 사진을 보면 Memory 512MB부분에 붉은 동그라미 보이시죠.
그걸 더블클릭해주세요.





그러면 이런창이 뜰꺼에요. 그럼 아래의 그림처럼 오른쪽 부분에 동그라미 안의 숫자를 바꾸면 렘의 용량이 바뀝니다.





이번엔 HardDisk의 용량을 바꿔보겠습니다.
아래의 그림처럼 붉은 동그라미를 더블클릭.





그 후 HardDisk를 Remove시켜버려요.
(만약에 이곳에 운영체제 깔고 Remove하는거면 당장멈춰요. 다 날아가버릴지도 몰라요.)





그 후 Add해주면 됩니다.





그럼 이런게 뜨는데 첫번째 HardDisk를 클릭하고 Next





첫번째 체크박스(Create a new virtual disk를 클릭하고 next~!)





SCSI를 클릭하고 Next~!





여기서 용량을 적어주고 Next~!





그 다음에 이름을 설정 Next





드디어 완료...ㅜ;;




Fedora설치는 3에서 할께요.