응용프로그램에서 소켓을 생성하면 해당 소켓에 대한 포인터를 가지고 있는 기술자 테이블(Descriptor Table)의 색인(Index)를 얻게 되는데,
이것을 소켓 기술자(Socket Descriptor)라고 부른다. (Windows에서는 소켓 핸들)
응용프로그램에서 소켓을 생성할 때는 socket함수를 사용한다.
Visual C++에서의 socket 함수
SOCKET
WSAAPI
socket(
_In_
int
af,
_In_
int
type,
_In_
int
protocol
); |
af = Address Family (domain) – 사용할 프로토콜 패밀리
type – 프로토콜에서 사용할 소켓 유형
protocol – 사용할 프로토콜
return value
- 지정한 유형의 소켓을 성공적으로 생성하면 소켓 기술자(소켓 핸들)을 반환한다.
- 소켓을 성공적으로 생성하지 못하면 socket 함수는 -1을 반환한다.
- typedef
UINT_PTR
SOCKET;
(Winsock2.h)
- typedef
_W64
unsigned
int
UINT_PTR,
*PUINT_PTR;
인자 | 값 | 비고 |
domain | PF_INET | IPv4 인터넷 프로토콜 패밀리 |
PF_INET6 | IPv6인터넷 프로토콜 패밀리 |
PF_LOCAL | 로컬 유닉스 소켓 프로그램 패밀리 |
PF_UNIX | 로컬 유닉스 소켓 프로그램 패밀리 |
type | SOCK_STREAM | 스트림 소켓 |
SOCK_DRAM | 데이터그램 소켓 |
SOCK_RAW | Raw 소켓 |
SOCK_SEQPACKET | 순차 패킷 소켓 |
protocol | IPPROTO_TCP | 스트림 소켓 |
IPPROTO_UDP | 데이터그램 소켓 |
socket은 사용한 후 더 이상 사용하지 않으면 소켓을 종료하고 자원을 반납해야 한다.
이 때 사용하는 함수가 close 함수이다. (Winsock에서는 closesocket)
int
WSAAPI
closesocket(
_In_
SOCKET
s
); |
SOCKET – 종료할 소켓
return value
소켓 기술자 (소켓 핸들)을 이용하여 자료를 송신하고 수신할 수 있다.
리눅스에서는 read 함수를 이용하여 자료를 수신하며
Winsock에서는 recv 함수를 이용한다.
int read(int fd, void *buf, int count); - 리눅스
int
WSAAPI
recv(
_In_
SOCKET
s,
_Out_writes_bytes_to_(len,
return)
__out_data_source(NETWORK)
char
FAR
*
buf,
_In_
int
len,
_In_
int
flags
); |
SOCKET s – 자료를 수신할 소켓 핸들
char FAR * buf – 수신한 자료를 저장할 버퍼의 주소 (포인터)
int len – 수신하는 자료의 최대 크기 (byte)
int flags – 옵션, NULL이면 리눅스 에서의 read 함수와 동일
return value
- 성공 – 실제 수신한 자료의 크기 (byte)
- 실패 – -1
리눅스에서는 write 함수를 이용하여 자료를 송신하며
Winsock에서는 send 함수를 이용한다.
int write(int fd, const void *buf, int count);
int
WSAAPI
send(
_In_
SOCKET
s,
_In_reads_bytes_(len)
const
char
FAR
*
buf,
_In_
int
len,
_In_
int
flags
); |
SOCKET s – 자료를 송신할 소켓 핸들
const char FAR * buf – 전송할 자료를 저장하는 버퍼의 주소 (송신 버퍼)
int len – 전송할 자료의 최대 크기 (byte)
int flags – 옵션, NULL이면 리눅스 에서의 write와 동일
return value
- 성공 – 실제 쓴 자료의 크기 (byte)
- 실패 – -1