TCP/IP Socket programming
응용프로그램에서 소켓을 생성하면 해당 소켓에 대한 포인터를 가지고 있는 기술자 테이블(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
- 성공하면 0, 실패하면 -1
소켓 기술자 (소켓 핸들)을 이용하여 자료를 송신하고 수신할 수 있다.
리눅스에서는 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
'Develop > TCP/IP' 카테고리의 다른 글
| socketpair 함수를 이용한 소켓 프로그램의 구현 (프로세스 하나에서) (0) | 2013.09.07 |
|---|
