#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
성공시 파일 디스크립터, 실패 시 -1을 리턴
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
성공시 파일 디스크립터, 실패 시 -1을 리턴
인자가 3개인데,
1) domain은 프로토콜 체계
2) type은 소켓의 전송 타입
3) protocol은 호스트대 호스트가 사용할 프로토콜을 설정하기 위해 사용
1) domain은 프로토콜 체계
2) type은 소켓의 전송 타입
3) protocol은 호스트대 호스트가 사용할 프로토콜을 설정하기 위해 사용
1)
프로토콜 체계라는것은 다음과 같은것들이 있다.
아래 표대로라면 PF_INET을 소켓의 첫번째 인자로 전달하는 경우에 생성되는 소켓은 주소 체계를 IPv4 기반으로 하는 인터넷 프로토콜에 적합하다.
-소켓은 프로토콜에 독립적이다.
-소켓은 이러한 모든 경우에 좋은 통신 도구가 될 수 있다.
프로토콜 체계라는것은 다음과 같은것들이 있다.
아래 표대로라면 PF_INET을 소켓의 첫번째 인자로 전달하는 경우에 생성되는 소켓은 주소 체계를 IPv4 기반으로 하는 인터넷 프로토콜에 적합하다.
PF_INET : IPv4 인터넷 프로토콜
PF_INET6 : IPv6 인터넷 프로토콜
PF_LOCAL : Local 통신을 위한 UNIX프로토콜
PF_PACKET : Low level socket을 위한 인터페이스
PR_IPX : IPX 노벨 프로토콜
PF_INET6 : IPv6 인터넷 프로토콜
PF_LOCAL : Local 통신을 위한 UNIX프로토콜
PF_PACKET : Low level socket을 위한 인터페이스
PR_IPX : IPX 노벨 프로토콜
-소켓은 프로토콜에 독립적이다.
-소켓은 이러한 모든 경우에 좋은 통신 도구가 될 수 있다.
2)
프로토콜 체계를 지정했음에도 불구하고,
소켓의 전송 타입을 지정해야 하는 것은, 하나의 프로토콜 체계에서도 데이터 전송방법이 여러가지가 있음을 말하는 것이다.
예를들어 IPv4 기반으로 하는 인터넷 프로토콜에서는 다음과 같은 두가지 전송 타입이 있다.
프로토콜 체계를 지정했음에도 불구하고,
소켓의 전송 타입을 지정해야 하는 것은, 하나의 프로토콜 체계에서도 데이터 전송방법이 여러가지가 있음을 말하는 것이다.
예를들어 IPv4 기반으로 하는 인터넷 프로토콜에서는 다음과 같은 두가지 전송 타입이 있다.
SOCK_STREAM : 연결 지향형 소켓
SOCK_DGRAM : 비연결 지향형 소켓
SOCK_DGRAM : 비연결 지향형 소켓
3)
이 인자는 호스트대 호스트가 사용할 프로토콜을 설정하기 위해 사용된다.
사실 맞다.
그래서 이 세번째 인자는 0을 넣어줘도 정상적으로 동작한다.
그렇다면 쓸데없는 이 세번째 인자는 왜 만들어놓은것인가?
예를 들어, 하나의 프로토콜 체계 안에서 데이터 전송 타입까지 같으면서도 최종적으로는 통신하는 형태가 다른 여러개의 프로토콜이 존재하는 경우에는, 이 세번째 인자가 유용한 인자가 된다. 즉 세번째 인자는 프로토콜을 조금 더 구체화하기 위해서 사용된다.
IPPROTO_TCP : TCP소켓을 생성하고자 할 경우에는 이 값을 넣어도되고 0을 넣어도 된다.
IPPROTO_UDP : UDP 소켓을 생성하고자 할 경우에는 이 값을 넣어도되고 0을 넣어도 된다.
이 인자는 호스트대 호스트가 사용할 프로토콜을 설정하기 위해 사용된다.
프로토콜 체계를 PF_INET으로 줬다.
전송 타입을 SOCK_STREAM으로 줬다.
그렇다면 TCP소켓의 생성을 의미하는 것이 아닌가?
전송 타입을 SOCK_STREAM으로 줬다.
그렇다면 TCP소켓의 생성을 의미하는 것이 아닌가?
프로토콜 체계를 PF_INET으로 줬다.
전송 타입을 SOCK_DGRAM으로 줬다.
그렇다면 UDP소켓의 생성을 의미하는 것이 아닌가?
전송 타입을 SOCK_DGRAM으로 줬다.
그렇다면 UDP소켓의 생성을 의미하는 것이 아닌가?
사실 맞다.
그래서 이 세번째 인자는 0을 넣어줘도 정상적으로 동작한다.
그렇다면 쓸데없는 이 세번째 인자는 왜 만들어놓은것인가?
예를 들어, 하나의 프로토콜 체계 안에서 데이터 전송 타입까지 같으면서도 최종적으로는 통신하는 형태가 다른 여러개의 프로토콜이 존재하는 경우에는, 이 세번째 인자가 유용한 인자가 된다. 즉 세번째 인자는 프로토콜을 조금 더 구체화하기 위해서 사용된다.
IPPROTO_TCP : TCP소켓을 생성하고자 할 경우에는 이 값을 넣어도되고 0을 넣어도 된다.
IPPROTO_UDP : UDP 소켓을 생성하고자 할 경우에는 이 값을 넣어도되고 0을 넣어도 된다.