[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;
}
멀티스레드 네트워크 프로그래밍은 복잡해질 수 있지만, 이를 통해 높은 성능과 효율성을 가진 네트워크 어플리케이션을 개발할 수 있습니다.
참고 자료:
- https://www.geeksforgeeks.org/multithreading-c-2/
- https://www.geeksforgeeks.org/socket-programming-cc/