[c언어] 소켓 프로그래밍 실습

이번 튜토리얼에서는 C언어를 사용하여 소켓 프로그래밍을 실습할 것입니다. 소켓을 사용하여 네트워크 통신을 구현할 수 있으며, 이를 통해 클라이언트와 서버 간에 데이터를 교환할 수 있습니다.

소켓 프로그래밍이란?

소켓은 네트워크 상에서 클라이언트와 서버 간에 양방향 통신을 가능케 하는 인터페이스입니다. 소켓을 사용하면 데이터를 전송하고 수신하는 데 사용되며, TCP 또는 UDP를 통해 통신할 수 있습니다.

실습 환경

이 실습을 진행하기 위해 리눅스 운영체제가 설치된 시스템이 필요합니다. 또한, C언어로 작성된 편집기와 컴파일러도 필요합니다.

실습 단계

  1. 서버 소켓 만들기: 먼저 서버 측 코드를 작성하여 소켓을 생성하고 클라이언트의 접속을 대기합니다.

  2. 클라이언트 소켓 만들기: 다음으로 클라이언트 측 코드를 작성하여 서버에 접속하고 데이터를 송수신합니다.

  3. 데이터 송수신: 마지막으로 서버와 클라이언트 간에 데이터를 주고받는 코드를 작성합니다.

코드 예제

서버 측 코드

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 8080

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};

    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);

    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }

    read(new_socket, buffer, 1024);
    printf("Message from client: %s\n", buffer);
    return 0;
}

클라이언트 측 코드

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

#define PORT 8080

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char *hello = "Hello from client";
    char buffer[1024] = {0};

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("\n Socket creation error \n");
        return -1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);

    if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {
        printf("\nInvalid address/ Address not supported \n");
        return -1;
    }

    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("\nConnection Failed \n");
        return -1;
    }
    send(sock , hello , strlen(hello) , 0 );
    printf("Hello message sent\n");
    return 0;
}

결론

이제 C언어로 소켓 프로그래밍을 실습하여 서버와 클라이언트 간에 데이터를 주고받을 수 있게 되었습니다. 이를 통해 네트워크 프로그래밍에 대한 기본적인 이해를 얻을 수 있습니다. 소켓 프로그래밍을 활용하여 더 복잡한 네트워크 응용프로그램을 개발할 수 있습니다.