반응형

소켓을 개설하여 통신에 이용하기 위해서는 다음의 다섯 가지 정보가 정해져야 합니다.

  1. 통신에 사용할 프로토콜 (TCP인지 UDP인지)
  2. 자신의 IP 주소
  3. 자신의 Port 번호
  4. 상대방의 IP 주소
  5. 상대방의 Port번호

 

함수 : socket()

// socket() 사용 문법

#include <sys/socket.h>

int socket(
    int domain,	// 프로토콜 체계
    int type,		// 서비스 타입
    int protocol);	// 소켓에서 사용할 프로토콜

 

각 매게 변수들

domain PF_INET (인터넷 프로토콜)
PF_INET (IPv6 프로토콜 체계 사용)
PF_UNIX (유닉스 방식의 프로토콜 체계 사용)
PF_NS (XEROX 네트워크 세스템의 프로토콜 체계 사용)
PF_PACKET (리눅스에서 패킷 캡쳐를 위해서 사용)
type SOCK_STREAM (TCP 소켓 생성)
SOCK_DGRAM (UDP 소켓 생성)
SOCK_RAW (Raw 소켓 생성)
protocol 어떤 프로토콜을 사용할 지 지정

SOCK_STREAM, DGRAM은 이미 정해졌으니 0을 입력
SOCK_RAW 선택한 경우에 구체적인 상위 프로토콜 지정

 

사용 예제

//----------------------------------
// 파일명	: open_socket.c
// 기 능	: socket() 시스템 콜을 호쿨하고, 생성된 소켓번호를 출력
// 컴파일	: gcc open_socket.c -o open_socket
// 사용법	: ./open_socket
//----------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>		// 소켓 시스템 콜에 필요한 상수 선언
#include <sys/socket.h>	// 소켓 시스템 콜 선언
#include <sys/stat.h>		// 파일의 상태에 대한 데이터 선언
#include <fcntl.h>			// open에 필요한 flag 선언
#include <unistd.h>

int main(){
    // 파일 및 소켓 번호
    int fd1, fd2, sd1, sd2;

    // 1.파일 열기
    fd1 = open("/etc/passwd", O_RDONLY, 0); // <fcntl.h>
    printf("/etc/paswwd's file descriptor = %d\n", fd1);
    // 2.스트림형 소켓 열기
    sd1 = socket(PF_INET, SOCK_STREAM, 0);
    printf("stream socket descriptor = %d\n", sd1);
    // 3.데이터그램형 소켓 열기
    sd2 = socket(PF_INET, SOCK_DGRAM, 0);
    printf("datagram socket descriptor = %d\n", sd2);
    // 4.또 다른 파일 열기
    fd2 = open("/etc/hosts", O_RDONLY, 0);
    printf("/etc/hosts's file descriptor = %d\n", fd2);

    //파일 및 소켓 닫기
    close(fd2);
    close(fd1);
    close(sd2);
    close(sd1);

    return 0;
}
실행 결과

/etc/passwd's file descriptor = 3
stream socket descriptor = 4
datagram socket descriptor = 5
/etc/hosts's file descriptor = 6

파일 디스크립터 0,1,2는 시스템이 이미 사용 중
0 - 표준 입력
1 - 표준 출력
2 - 표준 에러 출력

 

 


 

최대 소켓 수 확인 - getdtablesize()

한 프로세스에서 개설 가능한 최대 소켓 수를 알고 싶으면 getdtablesize()를 사용하면 됩니다.

#include <stdio.h>
#include <stdlib.h>

printf("getdtablesize() = %d\n", getdtablesize());

 

반응형