'2025/08/23'에 해당되는 글 4건

  1. 02:17:15 socket pthread

socket pthread

programming/C_C++ 2025. 8. 23. 02:17

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

#define PORT 9090
#define BUFFER_SIZE 1024

int server_fd, client_socket;
struct sockaddr_in address;
socklen_t addr_len = sizeof(address);

void timer_handler(int sig) {
    printf("Timer triggered!\n");
}

void* listen_thread(void* arg) {
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    int opt = 1;
    setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt));

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

    bind(server_fd, (struct sockaddr*)&address, sizeof(address));
    listen(server_fd, 3);

    printf("Listening on port %d...\n", PORT);
    client_socket = accept(server_fd, (struct sockaddr*)&address, &addr_len);
    printf("Client connected!\n");

    return NULL;
}

void* recv_thread(void* arg) {
    char buffer[BUFFER_SIZE];
    while (1) {
        memset(buffer, 0, BUFFER_SIZE);
        int valread = recv(client_socket, buffer, BUFFER_SIZE, 0);
        if (valread > 0) {
            printf("Received: %s\n", buffer);
        }
    }
    return NULL;
}

void* send_thread(void* arg) {
    char msg[BUFFER_SIZE];
    while (1) {
        printf("Enter message: ");
        fgets(msg, BUFFER_SIZE, stdin);
        send(client_socket, msg, strlen(msg), 0);
    }
    return NULL;
}

void start_timer() {
    struct itimerval timer;
    signal(SIGALRM, timer_handler);

    timer.it_value.tv_sec = 5;        // First trigger in 5 seconds
    timer.it_value.tv_usec = 0;
    timer.it_interval.tv_sec = 5;     // Then every 5 seconds
    timer.it_interval.tv_usec = 0;

    setitimer(ITIMER_REAL, &timer, NULL);
}

int main() {
    pthread_t listen_tid, send_tid, recv_tid;

    // Start listener
    pthread_create(&listen_tid, NULL, listen_thread, NULL);
    pthread_join(listen_tid, NULL); // Wait until a client connects

    // Start other threads
    pthread_create(&recv_tid, NULL, recv_thread, NULL);
    pthread_create(&send_tid, NULL, send_thread, NULL);

    // Start timer
    start_timer();

    pthread_join(recv_tid, NULL);
    pthread_join(send_tid, NULL);

    close(server_fd);
    return 0;
}

Posted by 공간사랑
,