반응형
socket(2)
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
socket( ) 시스템콜 함수는 다양한 형태의 socket 통신을 위한 socket descriptor(또는 file descriptor)를 생성하는 함수입니다.
파라미터
domain
- Protocol 계열(Protocol Family)을 설정합니다.
- Protocol Family는 <sys/socket.h>에 정의되어 있습니다.
- Protocol Family는 AF_*, PF_*의 상수로 선언되어 있으며, AF_*와 PF_*는 같은 값입니다.
- PF_*는 하위 호환성을 유지하기 <sys/types.h>에 정의되어 있으며, AF_*를 사용하기 바랍니다.
(PF_*를 사용하지 않는다면, #include<sys/types.h>는 필요없습니다.)
AF_UNIX, AF_LOCAL : machine 내부에서 사용하는 protocol로 File을 통해 통신합니다.
AF_INET : IPv4 기반의 internet protocol을 지원합니다.
AF_INET6 : IPv6 기반의 internet protocol을 지원합니다.
AF_IPX : Novell protocol을 지원합니다.
AF_NETLINK : Netlink를 지원합니다.
AF_X25 : ITU-T X.25 / ISO-8208 protocol을 지원합니다.
AF_AX25 : Amateur radio AX.25 protocol을 지원합니다.
AF_ATMPVC : raw ATM PVCs 접속을 지원합니다.
AF_APPLETALK : AppleTalk 접속을 지원합니다.
AF_PACKET : Low level packet interface를 지원합니다.
AF_ALG : kernel crypto API와 interface를 지원합니다.
type
- 데이터 전송 방식을 설정합니다.
- domain에서 정의한 Protocol Family 마다 모두 아래의 type을 지원하는 것은 아닙니다.
SOCK_STREAM : 데이터 전송 순서와 신뢰성을 보장하는 Connection base의 전송 방식.
수신쪽에서는 데이터를 보낸 횟수에 관계없이 보낸 크기만 의미를 가짐.
Out Of Band 데이터 전송이 가능함.
SOCK_DGRAM : 데이터 전송 순서 및 전송 신뢰성을 보장할 수 없는 Connection less 전송 방식.
순서 및 신뢰성 체크가 빠져서 성능이 빠름.
SOCK_SEQPACKET : 데이터 전송 순서와 신뢰성을 보장하는 Connection base의 전송 방식.
수신 시에는 보낸 데이터의 크기 만큼을 한번에 읽어야 함.
SOCK_RAW : raw network access를 제공함.
SOCK_RDM : 신뢰성있는 Datagram layer를 제공해주나 순서보장은 안됨
SOCK_PACKET : device drive(OSI 2 layer)와 raw data를 송수신할 때에 사용함.
protocol
- domain과 type에 의하여 최종적인 protocol이 정의되기 때문에 사용되지 않고 항상 0으로 설정합니다.
- 원래는 domain + type + protocol로 정의될 것으로 기대했으나,
지금까지는 domain + type에 의하여 통신 protocol의 결정됩니다.
통신 Protocol 별 설정값
Protocol 종류 domain type protocol
-------------------------------------------------------------
TCP AF_INET (IPv4) SOCK_STREAM 0
TCP AF_INET6 (IPv6) SOCK_STREAM 0
UDP AF_INET (IPv4) SOCK_DGRAM 0
UDP AF_INET6 (IPv6) SOCK_DGRAM 0
X.25 AF_X25 SOCK_STREAM 0
Local AF_UNIX SOCK_STREAM 0
Local AF_LOCAL SOCK_STREAM 0
RETURN
-1이 아님
- 정상적으로 생성된 socket 번호
-1
- 오류가 발생하였으며, 상세한 오류는 errno에 저장됩니다.
EACCES : Socket 생성권한 없음.
EAFNOSUPPORT : 지원하지 않는 address family.
EINVAL : Unknown protocol, or protocol family not available.
EINVAL : 잘못 설정된 type.
EMFILE : process별 생성할 수 있는 최대 file descriptor 갯수 초과
ENFILE : 시스템 전체 파일 open 갯수 초과
ENOBUFS or ENOMEM : 메모리 등의 리소스 부족 오류
EPROTONOSUPPORT : protocol 값을 잘못 설정함(domain에서 지원하지 않는 protocol)
활용 예제
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
......
int socket_no;
/* TCP/IP용 socket을 생성합니다. */
if((socket_no = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
fprintf(stderr, "socket open error: %s\n", strerror(errno));
return -1;
}
......
see also : Socket 통신과 Socket 응용
반응형
'C언어 header > sys | socket.h' 카테고리의 다른 글
connect(2) - 서버로 접속하기 (0) | 2019.09.29 |
---|---|
accept(2) / accept4(2) - client와 연결된 새로운 socket 생성 (0) | 2019.09.29 |
listen(2) - client가 접속할 수 있도록 준비 작업 (0) | 2019.09.29 |
struct sockaddr - Address Family에 따른 구조체 (0) | 2019.09.29 |
bind(2) - socket에 주소를 설정함 (0) | 2019.09.29 |