본문 바로가기

리눅스 멀티스레드 파일 공유 프로그램 - 3 본문

개인 프로젝트 공부

리눅스 멀티스레드 파일 공유 프로그램 - 3

Seongjun_You 2024. 6. 8. 17:47

클라이언트의 코드를 분석해 본다.

 

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>

#define PORT 8080
#define BUFFER_SIZE 1024

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char buffer[BUFFER_SIZE] = {0};

    // 소켓 파일 디스크립터 생성
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        std::cerr << "Socket creation error" << std::endl;
        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) {
        std::cerr << "Invalid address/ Address not supported" << std::endl;
        return -1;
    }

    // 서버에 연결
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        std::cerr << "Connection Failed" << std::endl;
        return -1;
    }

    // 서버에 메시지 보내기
    const char *message = "Hello from client";
    send(sock, message, strlen(message), 0);
    std::cout << "Hello message sent" << std::endl;

    // 서버로부터 메시지 읽기
    int valread = read(sock, buffer, BUFFER_SIZE);
    std::cout << "Message received: " << buffer << std::endl;

    // 소켓 종료
    close(sock);

    return 0;
}

전체 코드이다.

 

 

 

    // 소켓 파일 디스크립터 생성
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        std::cerr << "Socket creation error" << std::endl;
        return -1;
    }

    // 서버 주소 구조체 설정
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);

이 부분은 전 서버와 같이

socket()을 이용해 소켓 디스크립터를 생성해 준다.

구조체에 데이터를 넣어준다.

 

 

 

// 주소 변환
    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
        std::cerr << "Invalid address/ Address not supported" << std::endl;
        return -1;
    }

구조체 serv_addr.sin_addr에 IP값을 넣어야 한다.

inet_pton은 사람이 읽는 문자를 바이너리 형식으로 변환해 주는 함수이다.

네트워크 통신을 위해서는 바이너리 형식으로 바꿔주어야 한다.

"127.0.0.1"의 주소를 AF_INET형식으로 serv_addr.sin_addr에 넣어준다.

 

 

 

    char ip_str[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, &(serv_addr.sin_addr), ip_str, INET_ADDRSTRLEN);
    std::cout << "IP address: " << ip_str << std::endl;

추가로 serv_addr.sin_addr에 데이터가 잘 들어갔나 확인해보고 싶어

변환해 주는 코드를 짰다.

다시 변환할 때는 inet_ntop() 함수를 이용한다.

또한 INET_ADDRSTRLEN은 16이라는 상수이다.

 

 

// 서버에 연결
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        std::cerr << "Connection Failed" << std::endl;
        return -1;
    }

서버에 connect 해준다.

서버의 IP는 0.0.0.0이며

해당 클라이언트는 127.0.0.1이며 로컬통신이 가능해진다.

만들어둔 serv_addr을 타입캐스트 해준다.

 

 

// 서버에 메시지 보내기
    const char *message = "Hello from client";
    send(sock, message, strlen(message), 0);
    std::cout << "Hello message sent" << std::endl;

    // 서버로부터 메시지 읽기
    int valread = read(sock, buffer, BUFFER_SIZE);
    std::cout << "Message received: " << buffer << std::endl;

    // 소켓 종료
    close(sock);

 

서버와 클라이언트의 메시지를 주고받는다.

 

 

 

 

 

Comments