[c언어] 멀티스레드 네트워크 프로그래밍

C언어를 이용한 멀티스레드 네트워크 프로그래밍은 네트워크 어플리케이션을 개발할 때 중요한 부분입니다. 멀티스레딩을 이용하면 한 번에 여러 클라이언트 요청을 처리할 수 있으며, 네트워크 트래픽을 효율적으로 관리할 수 있습니다.

멀티스레드 프로그래밍

멀티스레드 프로그래밍은 하나의 프로그램이 동시에 여러 개의 스레드를 실행할 수 있게 하는 것을 의미합니다. C언어에서는 POSIX 스레드(pthread)나 윈도우스 스레드를 사용하여 멀티스레드 프로그래밍을 구현할 수 있습니다.

아래는 C언어를 사용한 간단한 멀티스레드 예제입니다.

#include <stdio.h>
#include <pthread.h>

void *print_message(void *ptr) {
  char *message = (char *)ptr;
  printf("%s \n", message);
}

int main() {
  pthread_t thread1, thread2;
  char *message1 = "Thread 1";
  char *message2 = "Thread 2";
  pthread_create(&thread1, NULL, print_message, (void *)message1);
  pthread_create(&thread2, NULL, print_message, (void *)message2);
  pthread_join(thread1, NULL);
  pthread_join(thread2, NULL);
  return 0;
}

네트워크 프로그래밍

네트워크 프로그래밍은 클라이언트와 서버 간의 통신을 처리하는 프로그램을 개발하는 것을 의미합니다. C언어에서는 소켓 프로그래밍을 통해 네트워크 프로그래밍을 구현할 수 있습니다.

아래는 C언어를 사용한 간단한 서버 소켓 예제입니다.

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

#define PORT 8080

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    
    char buffer[1024] = {0};
    char *hello = "Hello from server";
    
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }
    
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
        perror("setsockopt");
        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);
    }
    
    int valread = read( new_socket , buffer, 1024);
    printf("%s\n",buffer );
    send(new_socket , hello , strlen(hello) , 0 );
    printf("Hello message sent\n");
    return 0;
}

멀티스레드 네트워크 프로그래밍

멀티스레드 네트워크 프로그래밍은 멀티스레딩과 네트워크 프로그래밍을 결합한 것입니다. 이를 통해 여러 클라이언트의 요청을 동시에 처리하고, 병렬적으로 작업을 수행할 수 있습니다.

아래는 C언어를 이용한 간단한 멀티스레드 네트워크 프로그래밍 예제입니다.

// 이 예제는 여러 클라이언트의 요청을 동시에 처리하는 간단한 에코 서버입니다.

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

#define PORT 8080

void *connection_handler(void *socket_desc) {
  int new_socket = *(int *)socket_desc;
  char buffer[1024] = {0};
  int valread;
  
  while ((valread = read(new_socket , buffer, 1024)) > 0) {
    send(new_socket , buffer , strlen(buffer) , 0 );
    printf("Echo message sent\n");
    memset(buffer, 0, sizeof(buffer));
  }
  return 0;
}

int main() {
  int server_fd, new_socket;
  struct sockaddr_in address;
  int opt = 1;
  int addrlen = sizeof(address);
  
  char buffer[1024] = {0};
  char *hello = "Hello from server";
  
  if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
    perror("socket failed");
    exit(EXIT_FAILURE);
  }
  // ...
  
  pthread_t thread_id;
  
  if (pthread_create(&thread_id, NULL, connection_handler, (void *)&new_socket) < 0) {
    perror("could not create thread");
    return 1;
  }
  pthread_create(&thread_id, NULL, connection_handler, (void *)&new_socket);
  
  // ...
  return 0;
}

멀티스레드 네트워크 프로그래밍은 복잡해질 수 있지만, 이를 통해 높은 성능과 효율성을 가진 네트워크 어플리케이션을 개발할 수 있습니다.

참고 자료: