본문 바로가기

네트워크/리눅스 기반 강의

2010년 12월 14일 화요일 UNIX BSD 소켓 시스템 콜

소켓의 개설
통신을 하기위해서는 통신에 사용할 프로토콜(TCP 또는 UDP), 자신의 IP, 자신의 PORT, 상대방의 IP, 상대방의 PORT가 필요하다. 우선 소켓 생성부터 알아보기로 한다. 소스는 아래와 같다.
#include <stdio.h>
#include <arpa/inet.h>  // 프로토콜 타입 헤더파일 
#include <sys/socket.h>  // 소켓 헤더 파일 

int main()
{
  int tcp_sock;
  int udp_sock;

  /* 연결지향 tcp 소켓 생성 */
  tcp_sock=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  if(tcp_sock == -1)
  {
    printf("TCP socket error\n");
  }

  /* 비연결지향 udp 소켓 생성 */
  udp_sock=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  if(udp_sock == -1)
  {
    printf("UDP socket error\n");
  }

  printf("TCP socket : %d \n", tcp_sock);
  printf("UDP socket : %d \n", udp_sock);

  close(tcp_sock);
  close(udp_sock);
  
  return 0;
}
소켓의 사용문법은 다음과 같다.
int socket(int domain, int type, int protocol);
domain   : 프로토콜 체계
type     : 서비스 타입
protocol : 소켓에서 사용할 프로토콜
TCP/IP 프로토콜을 사용하려면 인터넷체계의 소켓을 개설해야하는데 그러기위해서는 domain을
PF_INET으로 지정해주어야한다. domain의 속성은 다음과 같다.
domain : PF_INET  (인터넷 프로토콜 체계)
         PF_INET6 (IPv6 프로토콜 체계)
         PF_UNIX  (유닉스 방식 프로토콜 체계)
         PF_NS    (XEROX 네트워크 시스템 프로토콜 체계)
type은 서비스 타입을 말하며 속성은 다음과 같다.
type : SOCK_STREAM (스트림 방식의 소켓 TCP)
       SOCK_DGRAM  (데이터그램 방식의 소켓 UDP
       SOCK_RAW    (RAW 모드의 소켓 생성) tcp나 udp를 거치지않고 바로 ip계층 이용
리눅스에서는 SOCK_PACKET타입을 지원 이는 ip계층도 거치지않고 바로링크 계층 인터페이스 이용
protocol은 구체적인 프로토콜을 선책 대부분 0을 지정
tcp_sock = socket(PF_INET, SOCK_STREAM, 0); << 이렇게해도 똑같음.
소켓주소 구조체
소켓의 구체적인 주소를 표현하기위해서는 주소체계, IP 주소, 포트번호 3가지가 지정되어야하며 이 세가지 정보를 소켓 주소라고 부른다. types.h 헤더파일에 설정되어 있으며 소켓 주소의 구조체는 다음과 같다.
struct sockaddr {
   u_short sa_family; // 주소체계
   char sa_data[14] // 주소
};  
액세스 할 수 있는 인터넷 전용 소켓주소 구조체
struct sockaddr_in {
   short sin_family; // 주소체계
   u_short sin_port; // 16비트 포트번호
   struct in_addr sin_addr // 32비트 IP주소
   char sin_zero[8];  // 전체 크기를 16바이트로 맞추기 위한 dummy
};
sin_family : AF_INET
                 AF_UNIX
                 AF_NS
위의 주소체계는 설명안해도 이제 무엇인지 다 알것이다.