소켓이란 무엇인가? -------------------------------------------------------------------------------------------
소켓이란 멀리있는 대상과 나를 연결해주는 통로 같은 존재. 전화기 같은 존재이다.
전화기로 통화를 하려면 상대의 전화번호를 알아야 하는 것처럼 소켓으로 컴퓨터간 네트워크 교류를 하려면 서로간의 IP주소를 알아야 한다.
위의 명령어는 연결을 요청하는 함수와 그 헤더파일이다.
위의 명령어는 연결요청을 수락한다는 함수이다.
이와 같이 소켓 프로그래밍도 어려울것이 없다.
전화기를 한대 구입하고, 전화번호를 할당한다음, 전화를 케이블에 연결하고, 전화를 기다리다가, 전화가 오면 전화기를 받고 대화를 하는 것이라고 보면 된다.
클라이언트? 서버? -------------------------------------------------------------------------------------------
일단 클라이언트와 서버의 기본적인 개념부터 이해해본다.
클라이언트란 여러분이 직접 플레이를 하고 있는 컴퓨터라고 보면 된다.
반대로 서버란? 여러분이 접속을 요청하는 게임회사에 존재하는 커다란 컴퓨터라고 보면된다.
일반적으로 클라이언트 쪽에서 대부분의 연락을 취한다.
게임 접속하겠습니다. 공격하겠습니다. 아이템 구매하겠습니다. 이동하겠습니다. 대부분의 요청을 클라이언트에서 요청하고 서버에서는 그것을 받아서 현재 클라이언트에 존재하는 객체의 값을 기록하거나 데이터를 변경하는 역할을 한다.
파일 입출력 -------------------------------------------------------------------------------------------
서버에서는 요청에 대한 대상을 파일로 간주하는 경우가 많다. 리눅스 기반이건 윈도우즈 기반이건 이는 다르지 않으며 시스템 수준에서 이러한 파일 입출력 조작함수를 지원한다.
리눅스에서는 이것을 파일디스립터라고 부르며 윈도우에서는 핸들이라고 부른다. 핸들은 윈도우즈 시스템 프로그래밍을 읽어본 나로서는 이해가 가는 부분이며 리눅스에서는 그것을 파일디스크립터라고 부른다고 이해하기로 했다. 즉 클라이언트에서는 항상 서버에게 이런 요청을 한다고 보면 된다.
내 파일(혹은 소켓)의 XX줄의 XX번부터 XX번까지를 참조해줘. 복사해줘....
당연히 이런 파일을 조작하기 위해서는 파일에 접근할수 있어야 하고 접근한다는 것은 그 파일을 열어서 조작한다는 것을 의미한다.
이런 명령어를사용해서 파일을 열어서 조작하여 클라이언트에 변화를 주는 것이다.
path 는 당연히 파일의 경로를 의미한다. 파일의 경로를 모르면 어떤 파일에 접근할지 알수가 없기 때문이다.
두번째로 flag는 파일의 모드를 의미한다.
방금 말했던대로 윈도우에서는 핸들이라고 하고 리눅스에서는 소켓 혹은 파일이라고 지칭했다. 윈도우에서 커널오브젝트나 핸들은 사용후엔느 닫아줘야 했다. 어느 시스템이건 이는 공통적으로 적용된다.
열고 닫는 함수가 있다면 당연히 쓰기 위한 함수도 있을 것이다.
fildes 데이터의 전송 영역을 나타내는 파일스크립터
buf 전송할 데이터를 가지고 있는 버퍼의 포인터
nbytes 전송할 바이트 수를 의미한다.
쓰는 함수가 있다면? 당연히 읽는 함수도 존재한다.
fildes 데이터의 전송해 주는 대상을 가리키는 파일스크립터
buf 수신 한 데이터를 저장할 버퍼를 가리키는 포인터
nbytes 수신할할 바이트 수를 의미한다.
여기까지는 리눅스 기반 일반적인 소켓과 파일 함수였다면 이번에는 윈도우즈의 소켓에 대해서 알아보자.
윈도우즈 소켓 기본 함수 및 프로그래밍 --------------------------------------------------------------------------
SOCKET socket(int af, int type, int protocol);
성공시 소켓 핸들을 반환한다. 실패시 INVALID_SOCKET를 반환한다.
-------------------------------------------------------
2. IP주소와 PORT번호의 할당을 목적으로 호출하는 함수
int bind(SOCKET s, cosnt struct sockaddr* name, int namelen);
-------------------------------------------------------
3. 소켓이 클라이언트의 프로그램의 연요청을 받아들일 수 있는 상태가 되게 하는 것을 목적으로 호출되는 함수.
int listen(SOCKET s, int backlog);
-------------------------------------------------------
4. 클라이언트 프로그램에서 연결요청을 수락할때 호출하는 함수.
SOCKET accept(SOCKET s, cosnt struct sockaddr* addrint addrlen);
-------------------------------------------------------
5. 클라이언트 프로그램에서 소켓을 기반으로 연결요청연결 요청을 할때 호출하는 함수
int connect(SOCKET s, cosnt struct sockaddr* name, int namelen);
-------------------------------------------------------
6. 소켓을 닫을때 사용하는 함수
INT closesoket(SOKET s);
소켓 과 핸들 ------------------------------------------------------------------------------------------------
윈도우에서는 시스템 함수의 호출을 통해서 파일을 생성할때 핸들을 반환한다. 윈도우는 리눅스와는 달리 파일 핸들과 소켓 핸들을 구분하고 있으며 핸들이라는 관점에서 바라볼 때는 동일하다고 바라볼수 있지만. 완벽하게 동일하지 않다.
윈도우 기반 입출력 함수 --------------------------------------------------------------------------
int send(SOCKET s, cosnt char * buf, int len, int flags);
s : 데이터 전송 대상과의 연결을 의미하는 소켓의 핸들 값 전달.
buf : 전송할 데이터를 저장하고 있는 버퍼의 주소 값 전달.
len : 전송할 바이트 수 전달.
flags : 데이터 전송 시 적용할 다양한 옵션 정보 전달.
-------------------------------------------------------
2. 데이터 수신 함수
int bind(SOCKET s, cosnt struct sockaddr* name, int namelen);
s : 데이터 수신 대상과의 연결을 의미하는 소켓의 핸들 값 전달.
buf : 수신된 데이터를 저장할 버퍼의 주소 값 전달.
len : 수신할 수 있는 최대 바이트 수 전달.
flags : 데이터 수신시 적용할 다양한 옵션 정보 전달.
-------------------------------------------------------
'게임개발공부 > 서버 공부' 카테고리의 다른 글
열혈강의 TCP/IP <TCP의 실제적인 데이터 입출력> (0) | 2013.11.29 |
---|---|
열혈강의 TCP/IP <소켓을 통한 서버 클라이언트 생성> (0) | 2013.11.29 |
열혈강의 TCP_IP <소켓에 대한 설명 UDP와 TCP의 차이 설명> (0) | 2013.11.29 |
윈도우 기반으로 소켓에 주소 할당하기 (0) | 2013.11.28 |
열혈강의 TCP_IP <소켓에 대한 설명> (0) | 2013.11.28 |