ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리눅스기반 소켓프로그래밍_기본적인 함수설명
    CS/Linux 2024. 4. 28. 17:48
    반응형

    소켓이란?

    - 소켓은 데이터의 송수신 방법으로 소켓을 통해서 컴퓨터간 데이터를 주고 받을 수 있다.

     

    파일 디스크립터

    -할당 받은 파일또는 소켓에 부여되는 정수를 의미한다.

    0: 표준 입력

    1: 표준 출력

    2: 펴준 에러

     

    소켓 함수의 소개

    1) 서버

    #include <sys/socket.h>

    c언어에서 소켓 프로그래밍을 위한 헤더파일이다.

     

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

    -소켓을 생성하는 함수, 성공시 파일 디스크립터, 실패시 -1을 반환한다.

    domain: 소켓이 사용할 프로토콜 체계 정보전달

    type: 소켓의 데이터 전송방식에 대한 정보전달

    -tcp 방식은 SOCK_STREAM udp 방식은 SOCK_DGRAM을 사용한다.

    protocol: 두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달, 주로 0으로 두지만 한가지 프로토콜에서 두가지 프로토콜로 나뉘는 경우처럼 특수한 경우에 사용해줘야한다. 0으로 둘경우 알아서 설정해준다.

    - IPPROTO_TCP, IPPROTO_UDP

    int bind()

    -생성한 소켓에 IP와 포트번호 주소정보를 등록한다. 성공시 0 실패시 -1반환

     

    int listen(int sockfd, int backlog)

    - 소켓이 연결가능한 상태가 된다. 성공시 0 실패시 -1반환

     

    int accpet(int socketfd, struct sockaddr *addr, socklen_t *addrlen)

    - 클라이언틀부터 소켓 연결 요청을 수락하는 함수이다.

    - 성공시 파일 디스크립터 , 실패시 -1을 반환한다.

     

    2)클라이언트

    int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addlen)

    -소켓을 대상으로 호출하는 함수

     

    주소표현을 위한 구조체

    sockaddr_in{

    sa_family_t sin_family // 주소체계

    uint16_t sin_port // 16비트 tcp/udp port번호

    struct in_addr  sin_addr //32비트 IP주소

    char sin_zero[8] 사용되지 않음

    }

     

    struct in_addr{

    in_addr_t   s_addr; //32비트 IPv4 인터넷 주소

    }

     

    sin_family

    AF_INET: IPv4

    AF_INET6: IPv6

     

    네트워크 바이트 순서변환함수

    빅엔디안 리틀 엔디안 이슈로 변환해주어야 한다. 네트워크 전송에서는 빅에디안 방식을 하용한다ㅣ.

    htons()

    ntohs()

     

    IP주소를 네트워크 바이트 순서로 변환해주는 함수

    inet_addr //성공시 32 비트 정수값 실패시 INADDR_NONE

    inet_aton //구조체에 따로 정의할 필요없이 자동으로 변환한 주소값을 구조체에 정의해줌

    inet_ntoa //반대의 기능을 제공한다. 바이트 주소를 IP주소로 변환해줌

     

    인터넷 주소의 초기화 방법

    struct sockaddr_in addr;

    char *serv_ip ="";

    char *serv_port = "prot"

    memset(&addr , 0 ,sizeof(addr)); // 바이트 초기화 함수

    addr.sin_family = AF_INET;

    addr.sin_addr.s_addr=inet_addr(serv_ip); or addr.sin_addr.s_addr=htonl(INADDR_ANY); // 소켓이 동작하는 컴퓨터의 IP주소를 자동으로 할당

    addr_sin_port=htons(atoi(serv_port))

     

    bind 과정

    socket()를 통해 소켓을 생성하고 addr_in 구조체에 주소정보를 할당했으면 이제는 bind()함수를 통해 소켓에다가 주소정보를 할당해야한다.

    int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);

    sockfd: 주소정보를 할당할 소켓의 파일 디스크립터

    myaddr: 주소정보를 가지고 있는 구조체 변수 주소의 값

    addrlen: 두 번째 인자로 전달된 구조체 변수의 길이정보

     

    예시) 소켓 생성과 초기화 그리고 주소정보 할당, 이는 기본적인 서버의 소켓 개발 과정이다.

    int serv_sock;
    struct sockaddr_in serv_addr;
    char *serv_port = "9190";
    
    //서버 소켓 생성
    serv_sock = socket(PF_INET, SOCK_STREAM, 0); //PF_INET은 IPv4로 SOCK_STREAM은 TCP 소켓 타입으로 하겠다는 뜻이다.
    
    
    //주소정보 초기화
    memset(&serv_addr, 0 ,sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    serv_addr.sin_port=htons(atoi(serv_port);
    
    //주소정보 할당
    bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

     

    반응형
Designed by Tistory.