본문 바로가기
TCP/IP

SOCKET() 함수

by 상레알 2010. 3. 25.


socket( )   : 소켓을 생성 하는 함수

#include<sys/types.h>
#include<sys/socket.h>

int socket(int domain, int type, protocol);
 

domain : 생성할 소켓이 통신을 하기 위해 사용할 프로토콜를 설정
type: 소켓이 데이터를 전송하는데 있어서 , 사용하게 되는 전송 타입을 설정
protocol : 두 호스트 간에 통신을 하는데 있어서 특정 프로토콜을 지정 하기위해 사용된다

socket 함수 호출 시 요구되는 세 개의 인자들이 각각 무엇을 의미하는지 상당히 애매하게 느껴질 것이다. 그렇게 느껴지는 것도 어떻게 보면 당연한 것이다. 그러나 소켓을 생성하기 위해서 이 세가지 인자에 대한 이해는 필수이다.
소켓 API는 다수의 프로토콜 패밀리들에 대한 하나의 총괄적인 인터페이스를 제공한다고 한다
---------------------------------------------------------------------------------------------------------------
DOMAIN

socket 함수의 첫 번째 인자로 프로토콜 체계를 지정해야 한다. 그렇다면 프로토콜 체계란 무엇은가. 또 어떠한 값을 지정해 주어야 하는지.... 아래 표는 인자로 전달할 수 잇는 프트토콜 체계를 정리 한 것이다.

프트토콜 체계(Protocol Family)

정의

PF_INET

IPv4 인터넷 프로토콜

PF_INET6

IPv6 인터넷 프로토콜

PF_LOCAL

Local 통신을 위한 UNIX 프로토콜

PF_PACKET

Low level socket 을 위한 인터페이스

PF_IPX

IPX 노벨 프로토콜

PF_INET 을 소켓의 첫 번째 인자로 전달하는 경우에 생성되는 소켓은 주소 체계를 IPv4기반으로 하는 인터넷 프로토콜에 적합한 소켓이 생성될 것이다. 다시 말하면 IPv4기반의 인터넷 프로토콜을 기본으로 하는 소켓을 생성하는 것이다.

데이터를 주고 받는 환경이 달라지면 그에 맞는 프로토콜이 존재하기 마련이다. 이러한 모든 경우에 소켓은 좋은 통신 기구가 될 수 있다. 왜냐하면 소켓은 여러 환경에서 사용될 수 있도록 설계되어 있기 때문이다. 따라서 소켓을 생성할 때 환경을 고려하여 프로토콜 체계를 지정해주면 그 환경에서 사용가능한 소켓이 생성된다. 즉 소켓은 모든 프로토콜을 수용할 수 있다는 뜻이라는데 이를 두고, 소켓은 “소켓은 프로토콜에 독립적이다.라고 표현한다.

우선  주소 체계는..

주소 체계(Address Family)  정의
 AF_INET  IPv4 인터넷 프로토콜
 AF_INET6  IPv6 인터넷 프로토콜
 AF_LOCAL  IPv6 인터넷 프로토콜
이렇게 있는대 이들은 주소 패밀리를 정의할때 사용한다.

그리고 예제 중 몇가지는 도메인 부분에 PF_INET 와 PF_INET 을   별 다른 얘기 없이 사용하는대
PF_INET은 프로토콜 체계(프로토콜 패일리) AF_INET 주소체계(주소 패밀리) 의 약자라고 한다 글자는 달라도 내부적으로는 구분하지 않는다.  하지만  ipv4의 경우이고  ipv6 같은겨우 AF_INET6 이라는 것을 사용한다. 만약 IP 프로토콜을 독립적으로 구성하고자 하려면  고려해야 된다.

프로토콜 체계를 나타내는 PF_INET과 주소 체계를 나타내는 AF_INET은 같은 상수 값을 가지고 있지만 그렇다고 해서 주소 정보를 설정하는 부분에 PF_INET을 사용하고 프로토콜 정보를 설정하는 부분에 AF_INET 을 넣는 것은 좋지 않을것 같군요....

프로토콜체계 설정하는 부분은 PF로 시작하는 상수를 사용하고 주소 체계를 설정하는 부분은 AF로 시작하는 상수를 사용하는게 좋을 것같다...  뭐 실제 코딩시에는 어떻것을 사용해도 문제는 되지 않지만... 혹시 꼬일수도 있으니....
------------------------------------------------------------------------------------------------------------

TYPE

두번째 인자는 소켓의 형태를 지정하는것인대  보통은 TCP , UDP 를 구분하지만   RAW 소켓을 이용할때는 이부분을 SOCK_RAW 로 써준다..

SOCK_STRAM : 연결지향의 TCP 프로토콜
SOCK_DGRAM : 데이터그램 지향의 UDP 프로토콜
SOCK_RAW : 생 소켓 혹은 날 소켓으로 불리우는 저수준 socket 제어 프로토콜
---------------------------------------------------------------------------------------------------------------
Protocol

세번째 인자는 소켓을 사용하기 위한 프로토콜 지정을 위해 사용된다.
 
1. IPPROTO_IP

optname

optval 타입

get

set

설명

IP_HDRINCL

BOOL

데이터를 보낼때 IP 헤더를 포함

IP_TTL

int

IP 패킷의 TTL(time-to-live) 변경

IP_MULTICAST_IF

IN_ADDR{}

멀티캐스트 패킷을 보낼 인터페이스 설정

IP_MULTICAST_TTL

int

멀티캐스트 패킷의 TTL 변경

IP_MULTICAST_LOOP

BOOL

멀티캐스트 패킷의 루프백 여부 설정

IP_ADD_MEMBERSHIP
IP_DROP_MEMBERSHIP

struct
ip_mreq{}

 

멀티캐스트 그룹 가입과 탈퇴


2. SOCK_STREAM 인자
- 연결지향 소켓이다.
- TCP기반 전송타입이다.
- 에러나 데이터의 손실 없이 무사히 전달된다.
- 전송하는 순서대로 데이터가 전달된다.
- 전송되는 데이터의 경계가 존재하지 않는다.
- 한번의 write 함수 호출을 통해서 데이터가 전송되었더라도 서너번의 read 함수 호출을 통해 데이터를 나누어수신하기도한다. 

3. SOCK_DGRAM  인자 

  - 비연결 지향소켓 이다.
  - 전송되는 순서에 상관없이 가장 빠른 전송을한다.
  - 전송되는 데이터는 손실될 수도 있고 에러가 발생할 수도 있다.
  - 전송되는 데이터의 경계가 존재한다.
  - 한번에 전송되는 데이터의 크기는 제한된다.

참고
 
리눅스의 ICMP 커널 프로토콜 모듈은 RFC92 에 정의되어 있는 Internet Control  Message Protocol 의 구현이다. 이 모듈은 에러 상태의 진단을 목적으로 사용된다 일반 유저는 이 모듈은 직접 제어 할 수 없고 커널 ICMP 모듈은 ICMP 요청에 응답하는 일도 한다.

유저는 raw socket의 IPPROTO_ICMP 프로토콜로 socket을 열어서 ICMP 패킷을 받을 수 있다. ICMP 패킷은 ICMP_FILTER 소켓 옵션을 이용해서 필터링 될 수 있다.

sysctl

sysctl 을 이용하면 ICMP의 설정을 변경할 수 있다. sysctl은 /proc/sys/net/ipv4/*에 있는 파일들을 읽고 쓰는 것으로 ICMP의 설정을 변경한다. 제어할 수 있는 값들은 다음과 같다.
icmp_echo_ignore_all
만약 리턴값이 0 이라면, 리눅스는 모든 ICMP_ECHO요청을 무시한다.
icmp_echo_ignore_broadcasts
만약 값이 0이 아니라면, 리눅스는 broadcast 주소로 보내어지는 모든 ICMP_ECHO 패킷을 무시한다.


---------------------------------------------------------------------------------------------------------------

참조 사이트  :   http://blog.naver.com/ifkiller?Redirect=Log&logNo=70081338273  
                      http://blog.naver.com/cache798/130023401466
                      http://www.joinc.co.kr/

 

'TCP/IP' 카테고리의 다른 글

Nagle 알고리즘  (0) 2011.05.02
getsockopt() , setopt () 함수  (0) 2011.05.02
ioctl : 장치 제어 함수  (0) 2011.04.29
소켓 함수 및 헤더들  (0) 2011.02.07
sendto()  (0) 2010.03.28
SOCKADDR_IN 구조체  (0) 2010.03.28
Linux: SOCK_PARCKET  (0) 2009.12.03
ICMP 프로토콜  (0) 2009.11.16
인터넷 소켓 활용  (0) 2009.08.31
TCP/IP 열혈 강의  (0) 2009.08.12