winsock 초기화
- MAKEWORD(2, 2) : winsock 2.2 버전 사용
- WSAStartup : winsock 라이브러리 초기화
WSADATA data;
WORD version = MAKEWORD(2, 2);
int wsOk = WSAStartup(version, &data);
if (wsOk != 0) {
std::cerr << "Can't initialize Winsock! Quitting" << std::endl;
return;
}
소켓 생성
- AF_INET : IPv4 주소 체계 사용
- SOCK_STREAM : TCP 소켓 생성 (SOCK_DGRAM->UDP)
- 0 : 기본 프로토콜 사용 (여기선 TCP)
clientSocket = NULL;
clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == INVALID_SOCKET) {
std::cerr << "Can't create socket! Quitting" << std::endl;
return;
}
서버 주소 설정
- sockaddr_in 구조체 :
- sin_family : 주소 체계 (IPv4)
- sin_port : 연결할 서버 포트 지정. htons는 네트워크 바이트 순서로 변환
- sin_addr : 서버 IP주소를 설정. inet_pton은 문자열 IP주소를 이진 데이터로 변환
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(port);
inet_pton(AF_INET, ip, &serverAddr.sin_addr);
서버에 연결
- connect 함수 : 지정된 IP와 포트로 서버에 연결 시도
- 연결 실패 시 소켓 닫고 winsock 정리(WSACleanup)
int connResult = connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr));
if (connResult == SOCKET_ERROR) {
std::cerr << "Can't connect to server! Quitting" << std::endl;
closesocket(clientSocket);
WSACleanup();
return;
}