#pragma comment(lib,"ws2_32.lib")
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <iostream>
class WSAInitializer {
public:
WSAInitializer() {
int result = WSAStartup(MAKEWORD(2, 2), &wsaData_);
if (result != 0) {
throw std::runtime_error("WSAStartup failed");
}
}
~WSAInitializer() {
WSACleanup();
}
WSADATA& GetWSAData() {
return wsaData_;
}
private:
WSADATA wsaData_;
};
int main() {
try {
// 초기화
WSAInitializer wsaInit;
// 주소정하기
ADDRINFO addressFilter{
.ai_flags = AI_PASSIVE,
.ai_family = AF_INET,
.ai_socktype = SOCK_STREAM,
};
ADDRINFO *address;
::getaddrinfo(NULL, "3333", &addressFilter, OUT &address);
//SOCKET 생성
SOCKET serverSocket = ::socket(address->ai_family,
address->ai_socktype,
address->ai_protocol);
// bind
::bind(serverSocket, address->ai_addr, address->ai_addrlen);
}
catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
return 1;
}
return 0;
}
WSA함수
이전과 다르게 WSA를 C++의 RAII(RAII: Resource Acquisition Is Initialization) 패턴을 활용해서
생성하고 소멸시점에서 WSA의 함수들을 사용하게 만들어서 코드를 작성했다.
class WSAInitializer {
public:
WSAInitializer() {
int result = WSAStartup(MAKEWORD(2, 2), &wsaData_);
if (result != 0) {
throw std::runtime_error("WSAStartup failed");
}
}
~WSAInitializer() {
WSACleanup();
}
WSADATA& GetWSAData() {
return wsaData_;
}
private:
WSADATA wsaData_;
};
ADDRINFO
ADDRINFO가 새롭게 배운 객체인데 getAddrinfo를 통해서 특정주소에 대한 주소정보를 가지고 올수 있다.
하지만 getaddrinfo에 특정주소 예) "192.168.1.0", "www.google.com" 이 아닌NULL을 사용하면 호스트의 주소에 대한 정보를 마지막인자를 통해서 받을 수 있다.
ADDRINFO addressFilter{
.ai_flags = AI_PASSIVE,
.ai_family = AF_INET,
.ai_socktype = SOCK_STREAM,
};
ADDRINFO *address;
::getaddrinfo(NULL, "3333", &addressFilter, OUT &address);
//SOCKET 생성
SOCKET serverSocket = ::socket(address->ai_family,
address->ai_socktype,
address->ai_protocol);
이전에 작성했던 코드 Socket생성
sockfd = socket(AF_INET, SOCK_STREAM, 0);
이전에 코드는 직접 소켓의 주소를 넣어줬다면 ADDRINFO를 통해서 좀더 안전하게 socket을 생성할수 있다.
'C++ > 네트워크' 카테고리의 다른 글
다시써보는 에코서버2 window 버전 (1) | 2024.06.02 |
---|---|
다시써보는 에코클라이언트 Linux 버전 (0) | 2024.06.01 |
다시 써보는 에코서버 window 버전 (0) | 2024.06.01 |