C++/네트워크

다시써보는 에코클라이언트 Linux 버전

교쟁이 2024. 6. 1. 21:47
#include <iostream>
#include <string>
#include <array>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/tcp.h>

// linux version

int main()
{
    int sock = 0;
    sockaddr_in server_addr = {
        .sin_family = AF_INET,
        .sin_port = htons(8888),
    };
    std::array<char, 1024> buffer{};
    std::string message = "Hello, Server!";

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

    // 소켓 옵션 변경 (noDelay)
    int nOpt = 1;
    ::setsockopt(sock,
                 IPPROTO_TCP, TCP_NODELAY,
                 reinterpret_cast<char *>(&nOpt),
                 sizeof(nOpt));

    // 서버 IP 주소 설정
    if (inet_pton(AF_INET, "192.168.35.154", &server_addr.sin_addr) <= 0)
    {
        std::cerr << "Invalid address/ Address not supported" << std::endl;
        return -1;
    }

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

    while (true)
    {
        std::cin >> message;
        if (message == "EXIT")
            break;

        send(sock, message.c_str(), message.length(), 0);
        std::cout << "Message sent: " << message << std::endl;

        int readSize;
        while ((readSize = read(sock, buffer.data(), buffer.size())))
        {
            if (readSize > 0)
                std::cout << "Server response: " << std::string(buffer.data(), readSize) << std::endl;
        }
    }
    // 서버로부터 응답 수신
    // 소켓 닫기
    close(sock);
    return 0;
}