-
240107 로컬 호스트 서버 연결해보기기록 2024. 1. 7. 20:31
서버에 대한 이해도가 필요하다고 느껴졌고,
이전에 만든 imgui 화면을 이용해 채팅 서버를 만들어보려고 한다.
서버
- 소켓 생성 socket()
- 포트 번호 바인딩 bind()
- 수신 대기 listen()
- 연결 수락 accept()
- 데이터 송수신 read()& write()
- 연결 종료 close()
클라이언트
- 소켓 생성 socket()
- 연결 요청 connect() - 포트번호 지정, IP 주소를 텍스트에서 바이너리 형식으로 변환
- 데이터 송수신 read() & write()
- 연결 종료 close()
위와 같은 순서로 개발할 예정이다.
1. GUI
사용자가 서버가 되어야하기 때문에 서버와 클라이언트 어떤것으로 접속할 지 선택한다.
if(false == SelectAccess) { if (ImGui::Button("Server Host")) { OpenServer(); SelectAccess = true; } if (ImGui::Button("Access Client")) { Connect(); SelectAccess = true; } }
추후 변경 점
1차 변경점) 서버가 존재하면 클라이언트로 접속하고 서버가 존재하지 않으면 본인이 서버가 될 수 있도록 변경할 예정이다.
2차 변경점) 외부 서버를 생성하고 클라이언트 대화창이 생성될 수 있도록 할 예정이다.
2. 서버
void OpenServer() { // 소켓 생성 WSAData WsaData; int errorCode = WSAStartup(MAKEWORD(2, 2), &WsaData); if (SOCKET_ERROR == errorCode) { MsgAssert("socket Error"); return; } SOCKADDR_IN Add; Add.sin_family = AF_INET; // ip4주소 체계를 쓰겠다. Add.sin_port = htons(Port); // 네트워크 통신에 유효한 에디안 방식으로 만들어준다. if (SOCKET_ERROR == inet_pton(AF_INET, "0.0.0.0", &Add.sin_addr)) { return; } MySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == MySocket) { return; } // 포트번호 바인딩 if (SOCKET_ERROR == bind(MySocket, (const sockaddr*)&Add, sizeof(SOCKADDR_IN))) { return; } // 수신대기 if (SOCKET_ERROR == listen(MySocket, BackLog)) { return; } }
3. 클라이언트
bool Connect() { // 내 프로그램이 네트워크를 사용할래요. WSAData WsaData; int errorCode = WSAStartup(MAKEWORD(2, 2), &WsaData); if (SOCKET_ERROR == errorCode) { MsgAssert("socket Error"); return false; } MySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == MySocket) { return false; } SOCKADDR_IN ClientAdd; ClientAdd.sin_family = AF_INET; ClientAdd.sin_port = htons(Port); // 로컬호스트 ip 내컴퓨터에 내가 접속하겠다. if (SOCKET_ERROR == inet_pton(AF_INET, IP.c_str(), &ClientAdd.sin_addr)) { return false; } int Len = sizeof(SOCKADDR_IN); // 접속 시간을 초과했습니다. if (SOCKET_ERROR == connect(MySocket, (const sockaddr*)&ClientAdd, Len)) { MsgAssert("커넥트에 실패했습니다."); return false; } return true; }
visual studio 2022에서 ctrl +alt + p 단축키로 연결 창을 열 수 있다.
Accept부터 추가로 진행할 예정~
'기록' 카테고리의 다른 글
240112 C++ 백준 런타임에러(NZEC) (1) 2024.01.12 240109 클래스 소멸자 가상화 (0) 2024.01.09 240107 windows.h와 winsock2.h 재선언으로 인한 문제 (0) 2024.01.07 240104 BSP Algorithm을 이용한 Random Map Generator (1) 2024.01.04 230101 Trial Algorithm (1) 2024.01.02