코딩스터디

서버와 클라이언트 만들기

애플앤마블 2019. 6. 2. 16:18
반응형
SMALL

https://www.fastcampus.co.kr

 

패스트캠퍼스 | 커리어 성장을 위한 최고의 실무교육 아카데미

커리어 성장을 위한 최고의 실무교육 아카데미

www.fastcampus.co.kr

위에 가면 더 좋은 강좌들이 많이 개설되어 있습니다. 개인적으로 사서 듣고있는데 도움이 많이 되는거 같아서 그 중 흥미로운 부분을 하나 

 

발췌해서 소개해드리고자 합니다.

 

코드들이 전부 개인적인 소유를 갖고 있을 수 있어 업로드를 안하지만, 이 실습 코드 같은 경우에 Git에 연동하여 공유하는 실습까지 함께 진

 

행 했을 뿐만 아니라 '이런것도 배워보고 싶었는데....!'하시는 분들(저같은 경우도 포함) 에게 접근성을 높일 수 있을 거 같아 포스트합니다.

 

한번 가셔서 저는 '컴퓨터공학 올인원 패키지'를 수강하고 있는데 관심있다면 들어보시길 바랄게요

 

이것은 두개의 솔루션 폴더가 필요하고 각 소스 파일에 (서버와 클라이언트) main.cpp를 삽입해주세요.

 

Server 입니다.

#include<iostream>
#include<string>
#include<winSock2.h>

using namespace std;

void ShowErrorMessage(string message)
{
	cout << "[ERROR CURRUPT]: " << message << '\n';
	system("pause");
	exit(1);
}

int main()
{
	WSADATA wsaData;
	SOCKET serverSocket, clientSocket;
	SOCKADDR_IN serverAddress, clientAddress;

	int serverPort = 9876;
	char received[256];

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
		ShowErrorMessage("WSAStartup()");
	
	serverSocket = socket(PF_INET, SOCK_STREAM, 0);

	if (serverSocket == INVALID_SOCKET)
		ShowErrorMessage("socket()");

	memset(&serverAddress, 0, sizeof(serverAddress));
	serverAddress.sin_family = AF_INET;
	serverAddress.sin_addr.s_addr = htonl(INADDR_ANY);
	serverAddress.sin_port = htons(serverPort);
	if (bind(serverSocket, (SOCKADDR*)& serverAddress, sizeof(serverAddress)) == SOCKET_ERROR)
		ShowErrorMessage("bind()");
	cout << "[현재 상태] bind()\n";
	
	if (listen(serverSocket, 5) == SOCKET_ERROR)
		ShowErrorMessage("listen()");
	cout << "[현재 상태] listen()\n";

	int sizeClientAddress = sizeof(clientAddress);
	clientSocket = accept(serverSocket, (SOCKADDR*)& clientAddress, &sizeClientAddress);
	cout << "[현재 상태] accept()\n";

	if (clientSocket == INVALID_SOCKET)
		ShowErrorMessage("accept()");
	
	while (1) {
		int length = recv(clientSocket, received, sizeof(received), 0);
		received[length] = NULL;
		cout << "[클라이언트 메세지]: " << received << '\n';
		cout << "[메세지 전송]:" << received << '\n';
		if (strcmp(received, "[exit]") == 0) {
			send(clientSocket, received, sizeof(received) - 1, 0);
			cout << "[서버 종료]\n";
			break;
		}
		send(clientSocket, received, sizeof(received) - 1, 0);
	}
	closesocket(clientSocket);
	closesocket(serverSocket);
	WSACleanup;
	system("pause");
	return 0;
}

 

Client 입니다

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <iostream>
#include <string>
#include <winsock2.h>

using namespace std;

void ShowErrorMessage(string message)
{
	cout << "[오류 발생]:" << message << '\n';
	system("pause");
	exit(1);
}

int main()
{
	WSADATA wsaData;
	SOCKET clientSocket;
	SOCKADDR_IN serverAddress;

	int serverPort = 9876;
	char received[256];
	string sent;

	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
		ShowErrorMessage("WSAStartup()");
	clientSocket = socket(PF_INET, SOCK_STREAM, 0);

	if (clientSocket == INVALID_SOCKET)
		ShowErrorMessage("socket()");

	memset(&serverAddress, 0, sizeof(serverAddress));
	serverAddress.sin_family = AF_INET;
	serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
	serverAddress.sin_port = htons(serverPort);

	if (connect(clientSocket, (SOCKADDR*)& serverAddress, sizeof(serverAddress)) == SOCKET_ERROR)
		ShowErrorMessage("connect()");
	cout << "[현재 상태] connect()\n";

	while (1) {
		cout << "[메세지 전송]: ";
		getline(cin, sent);
		if (sent == "") continue;
		send(clientSocket, sent.c_str(), sent.length(), 0);
		int length = recv(clientSocket, received, sizeof(received), 0);
		received[length] = '\0';
		if (strcmp(received, "[exit]") == 0) {
			cout << "[서버 종료]\n";
			break;
		}
		cout << "[서버 메세지]: " << received << '\n';
	}

	closesocket(clientSocket);
	WSACleanup();
	system("pause");
	return 0;
}
반응형
LIST