Development/C

소켓 프로그래밍을 통한 채팅 프로그램 만들기(2) - 소켓 프로그래밍에 사용되는 함수 및 구조체 개념

LikeMermaid 2022. 11. 29. 04:19
728x90

소켓 프로그램 예제코드

(출처 : https://reakwon.tistory.com/81)

//excample_scoket_code.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 12346
#define BUF_SIZE 1024
int main(void){
        int socket_fd,accepted_fd;
        struct sockaddr_in host_addr, client_addr;
        socklen_t size;
        int recv_length;
        char buffer[BUF_SIZE];

        socket_fd=socket(PF_INET,SOCK_STREAM,0);

        host_addr.sin_family=AF_INET;
        host_addr.sin_port=htons(PORT);
        host_addr.sin_addr.s_addr=0;
        memset(&(host_addr.sin_zero),0,8);

        bind(socket_fd,(struct sockaddr *)&host_addr,sizeof(struct sockaddr));

        listen(socket_fd,3);

        while(1){
                size=sizeof(struct sockaddr_in);
                accepted_fd=accept(socket_fd,(struct sockaddr *)&client_addr,&size);

                send(accepted_fd,"Connected",10,0);
                printf("Client Info : IP %s, Port %d\n", inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));

                recv_length=recv(accepted_fd,&buffer,BUF_SIZE,0);
                while(recv_length>0){
                        printf("From Client : %s\n",buffer);
                        recv_length=recv(accepted_fd,&buffer,BUF_SIZE,0);
                }

                close(accepted_fd);
        }
        return 0;
}

해당 코드는 단일(1:1) 소켓 프로그래밍 코드임
( Server <-> Client )


Socket Function

 

프로토콜 체계(Protocol Family)

socket 함수 첫 번째에 들어가는 인자로 생성되는 소켓이 사용할 프로토콜의 부류 정보를 전달함

이름 PF(Protocol Family)
PF_INET IPv4 인터넷 프로토콜 체계
PF_INET6 IPv6 인터넷 프로토콜 체계
PF_LOCAL 로컬 통신을 위한 UNIX 프로토콜 체계
PF_PACKET Low Level 소켓을 위한 프로토콜 체계
PF_IPX PIX 노벨 프로토콜 체계

 

소켓의 타입

socket 함수 두 번째에 들어가는 인자로 가장 보편적으로 사용되는 타입은 스트림 소켓데이터그램 소켓

Stream Socket : 양방향 통신으로 TCP Protocol을 표준으로 사용하고 있음(연결형)
Datagram Socket : 단방향 통신으로 UDP Protocol을 표준으로 사용하고 있음(비연결형)

 

프로토콜

socket 함수 세 번째에 들어가는 인자로 '0' 으로 설정하면 시스템이 자동으로 설정함


- bind structure -

 

주소 체계(Address Famliy)

bind 시 필요한 구조체에 담기는 데이터로 프로토콜 체계와 같은 상수를 가지고 있음

이름 PF(Protocol Family)
AF_INET IPv4 인터넷 프로토콜 체계
AF_INET6 IPv6 인터넷 프로토콜 체계
AF_LOCAL 로컬 통신을 위한 UNIX 프로토콜 체계

 

포트

bind 시 사용할 포트를 설정함

 

주소

bind 시 사용할 주소, 즉 IP를 설정하며 '0'으로 설정하면 현재 기기의 IP로 자동 설정됨