소켓이란?
소켓이란 멀리 떨어져 있는 두 개의 호스트를 연결시켜 주는 매개체 약할을 한다.
그리고 전화기에 전화번호를 할당하는 것처럼 소켓에도 IP주소를 할당한다. 그 후 연결 요청이 가능한 상태를 만들어야 한다.
누군가 데이터를 주고 받기 위해 연결 요청을 하면 그 요청을 수락할 수 있어야 한다.
저 수준 파일 입출력 ( Low-Level File Access)
리눅스 시스템 레벨에서 제공해주는 함수다.
파일 디스크립터(File Descriptor)
시스템으로부터 할당받은 파일이나 소켓을 대표하는 정수.
0 - 표준입력
1 - 표준 출력
2 - 표준 에러 출력
결국 파일 디스크립터란 시스템이 만들어 놓은 것을 가리키기 좋게 하기 위해 시스템이 우리들에게 건네주는 숫자이다.
윈도우즈에서는 핸들이라 불린다.
<<<리눅스에서 구현>>>
파일 열기
선언 :
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int open(const char *path, int flag);
path : 파일의 경로를 포함한 이름을 나타내는 문자열의 포인터.
flag : 파일 오픈 모드.(하나 이상의 모드를 '|'로 묶어서 인자로 전달 가능)
mode
O_CREAT : 필요한 경우 파일을 생성한다.
O_TRUNC : 존재하던 데이터를 모두 삭제한다.
O_APPEND : 존재하던 데이터는 보존하고 뒤에 이어서 저장한다.
O_RDONLY : 읽기 전용 모드로 파일을 연다.
O_WRONLY : 쓰기 전용 모드로 파일을 연다.
O_RDWR : 읽기 쓰기 겸용 모드로 파일을 연다.
파일 닫기
선언 :
#include <unistd.h>
int close(int fildes);
fildes : 닫아줄 파일의 파일 디스크립터.
close함수를 호출하면서 닫고자 하는 파일의 디스크립터를 인자로 전달한다.
데이터 쓰기
선언 :
#include <unistd.h>
ssize_t write(int fildes,const void *buf, size_t nbytes);
fildes : 데이터 전송 영역을 나타내는 파일 디스크립터.
buf : 전송할 데이터를 가지고 있는 버퍼의 포인터.
nbytes : 전송할 데이터의 바이트 수.
write함수는 파일에 데이터를 출력(전송)하는 함수이다.
데이터 읽기
선언 :
#include <unistd.h>
ssize_t read(int fildes, void *buf, size_t nbytes);
fildes : 데이터를 전송해 주는 대상을 가리키는 파일 디스크립터.
buf : 수신한 데이터를 저장할 버퍼를 가리키는 포인터.
nbytes : 수신할 최대 바이트 수.
read 함수는 데이터를 입력(수신)받는 함수이다.
<<<윈도우즈에서 구현>>>
윈속2를 기반으로 프로그램을 개발하기 위해서는 반드시 WINSOCK2.H를 포함해야 한다.
이 헤더파일을 포함시키기 위해선 WS_32.LIB를 링크시켜야 한다.
윈속 초기화하기
선언 :
#include <winsock2.h>
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAdata);
WORD wVersionRequested :
프로그램에서 요구하는 윈속의 최상위 버전을 알려주기 위해 사용된다. WORD 는 16비트(2바이트) unsigned int를 의미한다.
상위 8비트에는 부 버전을, 하위 8비트에는 주 버전을 표시해 준다.
예를 들어 V3.4이면 3이 주버전, 4가 부버전이다. 이는 0x0403로 인자를 넘겨주면 된다.
하지만 통상 매크로함수인 MAKEWORD(BYTE bLow, BYTE bHigh);를 사용한다.
LPWSADATA lpWSAdata :
WSADATA 타입 변수의 포인터를 인자로 전달한다. 함수 호출이 끝나고 나면 WSADATA변수에는 로딩한 DLL에 대한 정보가 채워진다.
종료시에는 WSACleanup(void); 함수를 통해서 할당받은 리소스를 해제한다.
윈속 기반의 소켓 관련 함수
생성 :
#include <winsock2.h>
SOCKET socket(int af,int type,int protocol);
주소와 PORT할당 :
#include <winsock2.h>
int bind(SOCKET s,const struct sockaddr FAR *name, int namelen);
연결요청 대기상태로의 진입 :
#include <winsock2.h>
int listen(SOCKET s, int backlog);
연결 수락 :
#include <winsock2.h>
SOCKET accept(SOCKET s, struct sockaddr FAR *addr,int FAR *addrlen);
연결 요청 :
#include <winsock2.h>
int connect(SOCKET s, const struct sockaddr FAR *name, int namelen);
윈속 기반의 데이터 입출력 함수
선언 :
#include <winsock2.h>
int send(SOCKET s, const char FAR *buf, int len,int flags);
s : 데이터를 전송할 호스트에 연결된 소켓의 핸들을 인자로 전달한다.
buf : 전송할 데이터를 저장하고 있는 버퍼를 가리키는 포인터이다.
len : 전송할 바이트 수를 인자로 전달한다.
flags : 함수 호출 시 여러 가지 옵션을 설정하기 위해서 사용된다.
int recv(SOCKET s, char FAR *buf, int len, int flags);
s : 데이터를 수신할 영역을 나타내는 소켓의 핸들.
buf : 수신할 데이터를 저장할 버퍼를 가리키는 포인터.
len : 수신할 최대 바이트 수.
flags : 함수 호출 시 여러가지 옵션을 설정하기 위해 사용된다.
'네트워크 프로그래밍' 카테고리의 다른 글
TCP / IP 소켓 프로그래밍 -3- (0) | 2009.09.18 |
---|---|
TCP / IP 소켓 프로그래밍 -2- (0) | 2009.09.18 |
UDP 경계 에코 클라이언트 구축하기 (0) | 2009.09.18 |
UDP 경계 에코 서버 구축하기 (0) | 2009.09.18 |
UDP 에코 클라이언트 구축하기 (0) | 2009.09.18 |