다시 써보는 에코서버 window 버전

2024. 6. 1. 21:42·C++/네트워크
#include <iostream>
#include <winsock2.h>
#include <WS2tcpip.h>
#include <array>

#pragma comment(lib, "ws2_32.lib")

int main() {
    WSADATA wsaData;
    if (::WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        std::cerr << "WSAStartup failed." << std::endl;
        return 1;
    }

    SOCKET listenSocket = ::socket(AF_INET, SOCK_STREAM, 0);
    if (listenSocket == INVALID_SOCKET) {
        std::cerr << "Failed to create socket." << std::endl;
        ::WSACleanup();
        return 1;
    }

    constexpr uint16_t port = 8888;
    SOCKADDR_IN serverAddress{
        .sin_family = AF_INET,
        .sin_port = htons(port),
        .sin_addr{.S_un{.S_addr = htonl(INADDR_ANY)}},
    };

    if (::bind(listenSocket, reinterpret_cast<SOCKADDR*>(&serverAddress), sizeof(serverAddress)) == SOCKET_ERROR) {
        std::cerr << "Bind failed." << std::endl;
        ::closesocket(listenSocket);
        ::WSACleanup();
        return 1;
    }

    if (::listen(listenSocket, SOMAXCONN) == SOCKET_ERROR) {
        std::cerr << "Listen failed." << std::endl;
        ::closesocket(listenSocket);
        ::WSACleanup();
        return 1;
    }

    SOCKET clientSocket;
    SOCKADDR_IN clientAddress;
    int clientAddressSize = sizeof(clientAddress);

    while ((clientSocket = ::accept(listenSocket, reinterpret_cast<SOCKADDR*>(&clientAddress), &clientAddressSize)) != INVALID_SOCKET) {
        std::cout << "새 클라이언트가 연결되었습니다." << std::endl;

        int receiveSize;
        std::array<char, 128> receivedBuffer;

        while ((receiveSize = ::recv(clientSocket, receivedBuffer.data(), receivedBuffer.size(), 0)) > 0) {
            ::send(clientSocket, receivedBuffer.data(), receiveSize, 0);
            std::cout.write(receivedBuffer.data(), receiveSize);
            std::cout << std::endl;
            receivedBuffer.fill(0);
        }

        if (receiveSize == SOCKET_ERROR) {
            std::cerr << "Receive failed." << std::endl;
        }

        ::closesocket(clientSocket);
        std::cout << "클라이언트가 연결이 끊겼습니다." << std::endl;
    }

    if (clientSocket == INVALID_SOCKET) {
        std::cerr << "Accept failed." << std::endl;
    }

    ::closesocket(listenSocket);
    ::WSACleanup();
    return 0;
}

'C++ > 네트워크' 카테고리의 다른 글

윈도우 소켓 깔끔하게 작성해보기  (0) 2025.03.11
다시써보는 에코서버2 window 버전  (1) 2024.06.02
다시써보는 에코클라이언트 Linux 버전  (0) 2024.06.01
'C++/네트워크' 카테고리의 다른 글
  • 윈도우 소켓 깔끔하게 작성해보기
  • 다시써보는 에코서버2 window 버전
  • 다시써보는 에코클라이언트 Linux 버전
교쟁이
교쟁이
  • 교쟁이
    Just Do it!!!
    교쟁이
  • 전체
    오늘
    어제
    • 분류 전체보기 (29)
      • C++ (2)
        • 자료구조 (0)
        • CMake (0)
        • 기초 (2)
        • 네트워크 (4)
      • 항해99 (15)
        • WIL (4)
      • Back-end (3)
        • DATABASE (3)
      • 글쓰기 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    동생
    항해99 #nodejs
    코드스테이츠
    socket
    TCP/IP
    테스트
    파이널 프로젝트
    항해 플러스 #테라폼
    Jest
    database
    항해 플러스 # CI/CD #Terraform
    신입개발자
    programming
    항해 플러스
    개발자
    항해99
    스타트업
    자바스크립트
    부트캠프
    네카라쿠배
    sql #database
    비전공자
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
교쟁이
다시 써보는 에코서버 window 버전
상단으로

티스토리툴바