🧼C, C++/네트워크

다중 클라이언트 C++ TCP #2

Mawile 2020. 11. 5.
728x90

 

개발환경 >> DevCpp

언어 >> C++11

운영체제 >> Windows10

 

 


[[[   지난 글   ]]]

 

다중 클라이언트 C++ TCP #1

시작하기 앞서서 사용한 운영체제는 Windows10이며 IDE는 DevCpp이고 사용한 언어는 C++11입니다! 참고자료 소켓 기본 틀 #1 [[[  서버 기본 틀  ]]] #include #include using namespace std; #define PACKET_..

mawile.tistory.com

[[[   참고   ]]]

 

 

소켓 기본 틀 #1

[[[  서버 기본 틀  ]]] #include #include using namespace std; #define PACKET_SIZE 1024 SOCKET skt,client_sock; int main(){ WSADATA wsa; WSAStartup(MAKEWORD(2,2), &wsa); skt = socket(PF_INET,SOCK_S..

mawile.tistory.com


안녕하세요!

저번에는 new키워드를 이용하여 TCP 프로토콜 상의 사용자 정의 크기 다중 클라이언트를

하나의 서버에서 관리할 수 있도록 만들었었습니다!

 

하지만 이것의 단점은 사용자가 스스로 정의할 수 있다고 해도

크기가 정해져 있고, 직접 수동으로 설정해야 한다는 단점이 있습니다.....

 

오늘은.....!!

저번 강의의 치명적 단점을 보완한... 강화 버전입니다...!!!!

사용자가 정의하지 않아도 무한대로 클라이언트를 수용할 수 있는 버전임~~ 니다!!!!!

                                                                                    (휘파람 소리~~~)

혹시 이해가 안 가실지도 모르니까 저번 꺼부터 보고 오시는 걸 추천드립니다~

 

 

 

 

그럼.. 시작하겠습니다..!


<<  사용한 문법 및 라이브러리  >>

 

vector

thread

winsock

c++ io

class

 

 


[[[   클라이언트   ]]]

#include <winsock2.h>
#include <iostream>
#define PACKET_SIZE 1024
using namespace std;

int main(){
	WSADATA wsa;
	if(WSAStartup(MAKEWORD(2,2),&wsa)!=0) return -1;
	
	SOCKET server = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(server == INVALID_SOCKET) return -1;
	
	SOCKADDR_IN addr={0};
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8080);
	
	while(connect(server,(SOCKADDR*)&addr,sizeof(addr)));
	
	char title[PACKET_SIZE];
	
	while(!WSAGetLastError()){ //메세지보내기
		cin >> title;
		send(server,title,strlen(title),0);
	}
}

 

 

 

클라이언트는 일반 메세지전송 클라이언트입니다!

while문으로 계속돌리면서 메시지 전송하는 겁니다~

 

 

 

[[[   서버   ]]]

#include <iostream> //c++io
#include <thread> //thread
#include <vector> //vector stl
#include <winsock2.h> //WSA
using namespace std; //namespace

#define PACKET_SIZE 1024 //datasizeUnity

SOCKET server; //서버 소켓

class Socket{ //하나의 클라이언트정보를 몽땅 저장할 클래스
	public: //외부에서 값변경가능
		SOCKET client;
		SOCKADDR_IN client_info={0};
		int client_size = sizeof(client_info);
		int number;
		Socket(){ //생성자
			client={0};
			client_info={0};
			client_size = sizeof(client_info);
		}
		~Socket(){ //소멸자
			client={0};
			client_info={0};
			client_size=-1;
			number=-1;
		}
}; vector<Socket>s; //Socket클래스형의 vector "s" 생성

//각 클라이언트들이 보내는 데이터를 처리할 멀티쓰레드함수
void recvData(SOCKET s,int num){ //클라이언트소켓,클라이언트번호
	char buf[PACKET_SIZE];
	cout << num << ".[입장]" << endl;
	while(1){
		ZeroMemory(&buf,PACKET_SIZE); //버퍼내용초기화
		recv(s,buf,PACKET_SIZE,0); //데이터받기
		if(WSAGetLastError()){ //클라이언트 연결끊김 감지
			cout << num << ".[퇴장]" << endl;
			return;
		}
		cout << num << ".받은메세지: " << buf << endl;
	}
}

void acceptClients(){ //클라이언트들을 수용할 멀티쓰레드함수
	int number=0; //클라이언트번호 전달변수
	while(1){
		s.push_back(Socket()); //생성자호출
		s[number].client = accept(server,(SOCKADDR*)&s[number].client_info,&s[number].client_size);
		//클라이언트 수용(accept)
        s[number].number = number;
        thread (recvData,s[number].client,number).detach();
        //해당번호의 클라이언트 멀티쓰레드함수 생성
		number++;
	}
}

int main(){
	WSADATA wsa;
	WSAStartup(MAKEWORD(2,2),&wsa);
	
	server = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
	
	SOCKADDR_IN addr={0};
	addr.sin_addr.s_addr = htonl(INADDR_ANY);
	addr.sin_port = htons(8080);
	addr.sin_family = AF_INET;
	
	bind(server,(SOCKADDR*)&addr,sizeof(addr));
	listen(server,SOMAXCONN);
	
	thread (acceptClients).detach();
	
	while(1); //메인함수가 끝나지않도록 하는 반복문
	
	closesocket(server);
	WSACleanup();
}

 

 

 

단순하게 원리를 설명하자면은 그냥

class를 만들고 vector에다가 담았습니다~

 

 


 

 

[[[   시연영상   ]]]

 

 

 


 

 

 

확실히 저번코드보다 더 간결하면서 효율적이네요~

 

 

이해가 안 가신다면 해당 부분을 댓글로 질문해주시길 바랍니다!!

그럼 소켓 다중 클라이언트 강좌는 여기서 끝내도록 하겠습니다!!

 

저가 바라던 단계까지는 왔지만 혹시 코드 최적화와 관련하여

그런 일이 생긴다면 다중 클라이언트 강좌도 다음 버전이 나올지도...??!

 

 

그럼 저는 이만...!

감사합니다~~~!!

 

 

 

 


 

 

 

 

[[[   다음글   ]]]

 

 

다중 클라이언트 C++ TCP #3

개발환경 >> DevCpp 언어 >> C++11 운영체제 >> Windows10 [[[  지난 글  ]]] > DevCpp 언어 >> C++11 운영체제 >> Windows10 [[[  지난 글  ]]] 다중 클라이언트 C++ TCP #1 시작하기 앞서서 사용한 운영체제..

mawile.tistory.com

 

728x90

댓글