728x90

C 언어에서 소켓 통신과 웹소켓을 사용하는 방법에 대해 설명드리겠습니다. 먼저, 소켓 통신에 대한 기본적인 내용을 다루고, 이후 웹소켓을 사용하는 방법을 설명하겠습니다.

1. C 소켓 통신

C 언어에서 소켓 프로그래밍을 위해서는 sys/socket.h, netinet/in.h, arpa/inet.h 등의 헤더 파일을 포함해야 합니다. 다음은 기본적인 TCP 소켓 서버와 클라이언트의 예제입니다.

TCP 서버

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define PORT 8080
#define BUF_SIZE 1024

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    char buffer[BUF_SIZE] = {0};
    char *hello = "Hello from server";

    // 소켓 생성
    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");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 리슨
    if (listen(server_fd, 3) < 0) {
        perror("listen failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 연결 수락
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept failed");
        close(server_fd);
        exit(EXIT_FAILURE);
    }

    // 데이터 수신 및 전송
    read(new_socket, buffer, BUF_SIZE);
    printf("Message from client: %s\n", buffer);
    send(new_socket, hello, strlen(hello), 0);
    printf("Hello message sent\n");

    close(new_socket);
    close(server_fd);
    return 0;
}

TCP 클라이언트

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define PORT 8080
#define BUF_SIZE 1024

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char *hello = "Hello from client";
    char buffer[BUF_SIZE] = {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");
    read(sock, buffer, BUF_SIZE);
    printf("Message from server: %s\n", buffer);

    close(sock);
    return 0;
}

2. 웹소켓

웹소켓은 일반적으로 C보다는 Python, Node.js 등의 고수준 언어에서 많이 사용됩니다. 그러나 C에서도 웹소켓 라이브러리를 사용하여 구현할 수 있습니다. 대표적으로 libwebsockets 라이브러리를 사용할 수 있습니다.

Libwebsockets 설치 및 사용

  1. Libwebsockets 설치:

     sudo apt-get update
     sudo apt-get install libwebsockets-dev
  2. 웹소켓 서버 예제:

     #include <libwebsockets.h>
     #include <string.h>
    
     static int callback_http(struct lws *wsi, enum lws_callback_reasons reason,
                              void *user, void *in, size_t len) {
         return 0;
     }
    
     static int callback_websocket(struct lws *wsi, enum lws_callback_reasons reason,
                                   void *user, void *in, size_t len) {
         switch (reason) {
             case LWS_CALLBACK_RECEIVE:
                 lws_write(wsi, (unsigned char *)in, len, LWS_WRITE_TEXT);
                 break;
             default:
                 break;
         }
         return 0;
     }
    
     static struct lws_protocols protocols[] = {
         { "http", callback_http, 0, 0 },
         { "websocket", callback_websocket, 0, 0 },
         { NULL, NULL, 0, 0 }
     };
    
     int main(void) {
         struct lws_context_creation_info info;
         struct lws_context *context;
    
         memset(&info, 0, sizeof info);
         info.port = 8000;
         info.protocols = protocols;
    
         context = lws_create_context(&info);
         if (context == NULL) {
             fprintf(stderr, "lws init failed\n");
             return -1;
         }
    
         while (1) {
             lws_service(context, 1000);
         }
    
         lws_context_destroy(context);
         return 0;
     }

위 코드는 기본적인 웹소켓 서버를 설정하는 예제입니다.
웹소켓 서버는 클라이언트로부터 메시지를 수신하면 동일한 메시지를 클라이언트로 되돌려줍니다.

728x90
반응형

'Software > C' 카테고리의 다른 글

C 시작하기 - 병렬 프로그래밍  (4) 2024.08.15
C 시작하기 - 라이브러리  (0) 2024.08.06
C 시작하기 - OpenCV 함수 4  (0) 2024.08.06
C 시작하기 - OpenCV 함수 3  (0) 2024.08.06
C 시작하기 - OpenCV 함수 2  (0) 2024.08.06

+ Recent posts