ls - 도스의 "dir"과 같은 역할, 해당 디렉토리에 있는 파일의 목록을 나열한다.

cd - 작업 디렉토리를 이동한다.

pwd - 현재 작업 디렉토리의 전체 경로를 출력한다.

rm - 파일이나 디렉토리를 삭제한다. 해당 파일이나 데릭토리에 삭제 권한이 있어야 한다.

cp - 파일이나 디렉토리를 복사한다. 새로 복사한 파일은 사용자의 소유가 된다.

touch - 크기가 0인 새 파일을 생성하거나 이미 존재하는 파일인 경우 수정시간을 현재시각으로 변경한다.

mv - 파일과 디렉토리의 이름을 변경하거나 위치 이동 시 사용한다.

mkdir - 새로운 디렉토리를 생성한다. 생성된 디렉토리는 명령어를 수행한 사용자의 소유가 된다.

rmdir - 디렉토리를 삭제한다. 해당 디렉토리의 삭제 권한이 있어야 하며, 파일이 들어 있으면 안된다. 파일이 들어있는 디렉토리를 삭제하려면 "rm -r"을 사용해야 한다.

cat - 텍스트로 작성된 파일을 화면에 출력한다. 파일의 내용을 간단히 확인하기 위해서 주로 사용한다.

head - 텍스트로 작성된 파일의 앞 10행을 출력한다.

tail - 텍스트로 작성된 파일의 뒤 10행을 출력한다.

more - 텍스트로 작성된 파일을 화면에 페이지 단위로 출력한다.
        - Spacebar는 다음페이지, b는 앞페이지, q는 종료이다.

less - more와 용도가 비슷하지만 기능이 더 확장된 명령이다. more의 키 및 화살표, Page Up, Page Down도 작동한다.(vi의 기능이 일부 추가되었다고 보면된다.)

file - File이 어떤 종류의 파일인지 표시해 준다.

clear - 명령창을 깨끗하게 지워준다.





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


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 반환

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

헤더파일
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;
}

BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin,
                                UINT wMsgFilterMax);
리턴값 - false면 윈도우 종료

BOOL PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin,
                                UINT wMsgFilterMax,UINT wRemoveMsg);
리턴값 - 메시지를 가져오면 true, 가져오지 못하면 false

LPMSG lpMsg
 - 메세지 구조체의 포인터
HWND hWnd
 - 메세지 큐를 확인할 윈도우의 핸들
UINT wMsgFilterMin
 - 최소값을 넘겨주면 최소값보다 작은 메세지는 가져오지 않는다. (보통 0)
UINT wMsgFilterMax
 - 최대값을 넘겨주면 최대값보다 큰 메세지는 가져오지 않는다. (보통 0)
UINT wRemoveMsg
 - 플래그 값



차이점 - GetMessage함수는 메시지 큐에서 메시지를 받아올 때까지 계속 기다린다.
           하지만 PeekMessage함수는 메시지큐에 메시지가 없어도 기다리지 않고 false를 리턴한다.


활   용 - 메시지 큐에 메시지가 없을 때, 데드타임이 발생하는데
         GetMessage를 사용한다면 데드타임을 활용할 수 없다.
         하지만 PeekMessage를 사용할 경우 이 데드타임을 활용할 수 있다.

데드타임 - 이 때는 주로 프레임을 그려주거나 프레임을 업데이트 시켜주는 일을 시킨다.

 여러개의 쓰레드가 동시에 하나의 변수를 변경시켜줄 때, 문제가 생기는 것을 방지하기 위해 쓰레드에 순위를 매겨서 처리하는 방식의 세마포어와는 달리 뮤텍스는 쓰레드가 들어오는 순서대로 처리해 주는 방식으로 사용한다.



class CMutex
{
private:
    static HANDLE m_mutex;    //뮤텍스 핸들
    DWORD m_owner; //지금 Lock되어있는 Thread ID값
public:
    static void Init();
    static void Remove();
    CMutex();
    ~CMutex();
    void Lock();
    void Unlock();
};

void CMutex::Init()
{
    m_mutex = CreateMutex(NULL,FALSE,NULL);
    memset(&m_owner, 0, sizeof(DWORD));
}
void CMutex::Remove()
{
    WaitForSingleObject(m_mutex,INFINITE);
    CloseHandle(m_mutex);
}

CMutex::CMutex()
{
}

CMutex::~CMutex()
{
}

void CMutex::Lock()
{
 DWORD ThreadID = GetCurrentThreadId();
    if(m_owner != ThreadID)
    {
        WaitForSingleObject(m_mutex,INFINITE);
        m_owner = ThreadID;<br />
    }
}

void CMutex::UnLock()
{
    DWORD ThreadID = GetCurrentThreadId();
    if(m_owner == ThreadID)
    {
        ReleaseMutex(m_mutex);
        memset(&m_owner,0,sizeof(DWORD));
    }
}
 

 쓰레드에서 다른 쓰레드와 공유중인 변수를 쓰기전에 Lock()로 막아 놓으면 WaitForSingleObject(m_mutex,INFINITE)에 의해 다른 쓰레드는 뮤텍스가 ReleaseMutex(m_mutex)되기를 기다리게 된다.