728x90

decltype(expression) 자료형은 선언된 변수를 expression의 자료형과 동일하게 설정해줍니다. 

 

decltype은 Visual Studio 2010 버전부터 지원되고 decltype(auto) (C++14)는 Visual Studio 2015 버전부터 지원이 됩니다. 

  

decltype 자료형에 대한 예제입니다.

#include <iostream>
#include <typeinfo>

using namespace std;

int main()
{
	int a = 5;
	double b = 5.5;
	char c = 'c';
	int func();

	decltype(a) da;
	decltype(b) db;
	decltype(c) dc;
	decltype(func()) dfunc;

	cout << "da의 type : " << typeid(da).name() << endl;
	cout << "db의 type : " << typeid(db).name() << endl;
	cout << "dc의 type : " << typeid(dc).name() << endl;
	cout << "dfunc의 type : " << typeid(dfunc).name() << endl;
}

/*
실행결과
da의 type : int
db의 type : double
dc의 type : char
dfunc의 type : int
*/

 

728x90

'Programming > C++' 카테고리의 다른 글

C++ 디폴트 매개변수  (0) 2020.02.06
C++ reference value(참조형 변수)  (0) 2020.02.04
C++ new, delete  (0) 2020.01.20
C++11 auto  (0) 2020.01.14
C++ const, mutable  (0) 2020.01.10
728x90

1. 수업을 마치며1 : https://opentutorials.org/course/3084/18896

 

수업을 마치며 1 - 생활코딩

--- 여기까지 오시느라 정말 고생 많으셨죠? 대단하십니다. 축하드리고요. 지금까지 우리는 웹의 본질을 샅샅이 들춰 봤습니다. 이제 멈춰서서 앞으로 어떻게 할 지 같이 의논해 보시죠. 저는 기술을 본질과 혁신으로 구분합니다. 또 학습을 교양과 직업으로 분리합니다. 웬지 본질은 교양과 좋은 짝이고 혁신은 직업과 좋은 짝이라는 생각이 듭니다. 코딩교육을 하면서 알게 된 것을 그래프로 그려 봤습니다. 이 그래프의 x축은 진도입니다. 또 두 개의 선이 등장합니다

opentutorials.org

2. 수업을 마치며2 : https://opentutorials.org/course/3084/18897

 

수업을 마치며 2 - 생활코딩

--- 이전 영상에서는 교양을 위해서 코딩을 배우고 있는 학우들과 작별의 시간을 가졌습니다. 그럼 이제 이 영상을 보고 계신 분들은 더 많은 것을 알고 싶은 분들일 거에요. 가야 할 길이 멀기 때문에 마음이 급하시죠? 그런데 지금은 공부를 더 하기도 좋은 때입니다만 공부를 멈추고 공부한 것을 사용하기도 좋은 때입니다. 공부만 하고 공부한 것을 사용하지 않으면 나중엔 머리 속이 너무 복잡해져서 막상 코딩을 하려니 무엇을 해야할 지 모르게 됩니다. 또 공부를

opentutorials.org

 

728x90
728x90

1. 웹 서버 운영하기 : https://opentutorials.org/course/3084/18892

 

웹서버 운영하기 - 생활코딩

웹서버 소개 --- 이번 시간에는 내 컴퓨터에 웹서버를 설치해서 누구나 내 컴퓨터에 있는 웹페이지를 볼 수 있도록 해 보겠습니다. 이 과정은 꽤 많은 지식이 필요하기 때문에 좀 어렵습니다. 대신 인터넷이 동작하는 원리를 알 수 있다는 것은 큰 장점입니다. 그리고 한 가지 당부드리고 싶은 것은 실습이 잘 작동하지 않을 가능성이 매우 높아요. 인터넷은 실제로는 매우 복잡한 시스템이거든요. 제대로 작동하는 이유는 한 가지 입니다만, 작동하지 않는 이유는 수십

opentutorials.org

컴퓨터에 웹 서버를 설치하는 방법입니다. 웹 서버의 제품군은 Apache, IIS, Ngnix 등이 있는데 Apache를 설치하려고 합니다. Apache는 오픈소스이며 무료이고, 웹 서버 제품군 중 점유율 1위입니다.

 

Apache는 Windows, Mac, Linux에 설치할 수 있습니다.

2-1. 윈도우에 웹서버 설치 : https://opentutorials.org/course/3084/18893

 

웹서버 운영 : 윈도우 - 생활코딩

자신의 운영체제에 맞는 수업을 찾아서 학습해주세요. 윈도우에 웹서버 설치 웹서버와 http 웹브라우저와 웹서버의 통신 --- 윈도우에 웹서버 설치 이번 시간에는 아파치 웹서버를 윈도우 컴퓨터에 설치하는 방법을 살펴보겠습니다. 아파치를 윈도우에 직접 설치하는 것은 꽤 까다로운 일이 에요. 그래서 아파치를 윈도우에 설치해주는 프로그램들이 있습니다. 검색창에 아래와 같이 입력해 봤습니다. '어떻게 하면 윈도우에서 아파치를 쉽게 설치할 수 있나?' how to

opentutorials.org

 

 

728x90
728x90

1. 웹호스팅 : https://opentutorials.org/course/3084/18891

 

웹호스팅 (github pages) - 생활코딩

--- 직접 웹서버를 운영하는 일은 쉽지 않은 일입니다. 우선 컴퓨터가 있어야 하고요, 컴퓨터가 냉장고처럼 항상 켜져 있어야 합니다. 웹서버라는 프로그램을 배워서 설치해야 합니다. 또 인터넷을 통해서 외부로 정보를 전송할 수 있게 설정을 해야 합니다. 쉽지 않습니다. 그래서 이런 일을 대행해 주는 회사들이 있습니다. 인터넷에 연결된 컴퓨터 하나 하나를 호스트라고 합니다. 이런 컴퓨터를 빌려주는 사업을 호스팅이라고 합니다. 웹서버를 전문적으로 빌려주는 비즈

opentutorials.org

 

수많은 웹 호스팅 서비스 중에 https://github.com/을 사용합니다.

 

Build software better, together

GitHub is where people build software. More than 40 million people use GitHub to discover, fork, and contribute to over 100 million projects.

github.com

 github에 들어가 왼쪽 상단에 있는 new를 눌러줍니다. new는 new repository를 의미합니다.

repository name을 설정하고 repository 생성과 동시에 README 파일을 생성해주는 옵션을 체크해 줍니다.

아래와 같이 만들어 졌다면 Upload files를 눌러 만든 html파일들을 올려줍니다.

아래 commit changes에 comment를 남기면 파일이 수정될때마다 comment를 넣어줄 수 있습니다.

파일이 제대로 올라갔다면 아래와 같이 확인할 수 있습니다.

github는 올린 html 파일들로 웹 사이트를 운영할 수 있게 웹 서버를 제공해줍니다. 그것을 위해선 설정을 해줘야합니다. 상단에 Settings를 눌러줍니다.

 

그리고 아래로 내려 GitHub Pages라고 되어있는 내용 중 Source의 None을 master branch로 바꿔줍니다.

master branch로 바꿨으면 상단에 Your site is ready to be published at 다음 주소가 나와있습니다. 주소를 눌렀을 때 창이 제대로 뜨지 않으면 주소 뒤에 메인 html 파일을 적어줍니다.

https://psy1064.github.io/Web_class/main.html

 

IU

 

psy1064.github.io

우리가 github를 이용해 웹 호스팅한 구조는 아래와 같습니다.

728x90
728x90

1. 원시 웹 : https://opentutorials.org/course/3084/18889

 

원시웹 - 생활코딩

--- 우리 수업은 두 개의 산으로 이루어져 있습니다. 하나의 산은 웹페이지를 만드는 것입니다. 여러분은 방금 이 산을 멋지게 넘었습니다. 또 하나는 내가 만든 웹페이지를 인터넷을 통해서 누구나 가져갈 수 있게 하는 것입니다. 지금까지 여정에 대한 휴식이면서 앞으로 가야할 여정에 대한 준비를 위한 시간을 마련했습니다. 바로 웹의 역사 입니다. 이 수업은 2017년에 만들어졌습니다. 웹이 시작된 1990년 이후로 27년간 웹은 가장 중요한 정보기술로 군림하

opentutorials.org

인터넷과 웹은 아래의 그림처럼 나타낼 수 있습니다. 웹은 인터넷의 부분집합입니다. 1960년 인터넷이 등장했고, 1990년 웹이 등장했습니다.

1960년에는 핵전쟁을 치른 직후라 핵에 대한 공포감이 있고 핵 공격을 당했을 때의 통신 약점을 해결하고자 했습니다. 그 약점을 해결할 수 있는 방법을 강구했고 그것이 인터넷입니다. 인터넷은 분산해서 각각이 전화국 같은 역할을 해 하나가 사라져도 나머지가 역할을 할 수 있습니다.  

 

다음으로 웹에 대한 내용입니다. 웹은 1990년 스위스에서 탄생했습니다. 유럽의 물리입자연구소에서 팀 버너스 리라는 사람이 소프트웨어 엔지니어로 일하게 되었습니다. 그때 연구소에 인터넷이 도입되었고 팀 버너스 리는 1990년 10월 웹페이지를 편집하는 프로그램을 만들게 됩니다. 그리고 11월에 세계 최초의 웹브라우저인 월드 와이드 웹(World Wide Web)을 만듭니다. 12월 24일 웹 서버를 완성하고 그 웹서버에 http://info.cern.ch라는 도메인을 부여합니다.

 

http://info.cern.ch

 

info.cern.ch

2. 인터넷을 여는 열쇠 : 서버와 클라이언트 : https://opentutorials.org/course/3084/18890

 

인터넷을 여는 열쇠 : 서버와 클라이언트 - 생활코딩

--- 지금부터 인터넷이 동작하는 기본적인 원리를 알아보겠습니다. 질문입니다 인터넷이 동작하기 위해서는 컴퓨터가 최소 몇 대가 있어야 할까요? 2대입니다 1대는 인터넷이 아니고 3대는 본질적이지 않죠. 2대의 컴퓨터가 서로 정보를 주고 받는 순간 인류는 완전히 새로운 존재가 되었습니다. 팀 버너스리는 인터넷을 이용해서 웹을 만들기로 합니다. 이를 위해서 인터넷으로 연결된 2대의 컴퓨터를 장만합니다. 그리고 2개의 프로그램을 개발합니다. 각각의 프로그램에

opentutorials.org

인터넷이 동작하기 위해선 최소 2대의 컴퓨터가 필요합니다. 한 컴퓨터에는 Web browser가 설치되어 있고 다른 컴퓨터에는 Web Server가 설치되어있습니다. 두 컴퓨터는 인터넷으로 연결되어 있습니다.

 

Web Server가 설치되어 있는 컴퓨터는 주소를 가지고 있고 하드디스크에 html 파일이 저장되어 있습니다. 

Web browser가 설치되어 있는 컴퓨터에서 주소와 파일을 입력하면 Web Server에서는 파일의 내용(코드)을 보내줍니다. 그렇게 되면 Web browser가 html 파일을 읽어 화면에 표시해줍니다.

 

이 두 관계를 고객과 서비스를 제공하는 사람의 관계를 따서 client와 server로 부릅니다.

웹 서버를 직접 설치하는 방법과 웹 서버를 제공해주는 방식이 있는데 후자의 경우를 웹호스팅 한다고 합니다.

728x90
728x90

auto 자료형은 선언된 변수의 초기화 식으로부터 타입을 추론하여 설정합니다.

 

auto 자료형은 4가지 장점이 있습니다.

  • 견실성 : 선언한 변수의 타입, 함수의 반환형이 바뀌어도 문제없음
  • 성능 : 형 변환이 없음을 보장할 수 있음
  • 유용성 : 변수 타입 이름의 스펠링 오타나 어려움에 대해 걱정하지 않아도 됨
  • 효율성 : 코딩을 더 효율적으로 할 수 있게 도와줌

하지만 auto를 사용하길 원하지 않는 경우도 있습니다.

  • 특정 형식을 사용하기를 원하는 경우
  • 템플릿 식을 사용하는 경우

auto 자료형에 대한 예제입니다.

#include <iostream>
#include <typeinfo>

using namespace std;

int main()
{
	int a = 5;
	auto b = 6;
	auto c = 11.1;
	auto d = 'c';
	auto e = "str";
	
	cout << "a의 type : " << typeid(a).name() << endl;
	cout << "b의 type : " << typeid(b).name() << endl;
	cout << "c의 type : " << typeid(c).name() << endl;
	cout << "d의 type : " << typeid(d).name() << endl;
	cout << "e의 type : " << typeid(e).name() << endl;
}

/* 
실행결과
a의 type : int
b의 type : int
c의 type : double
d의 type : char
e의 type : char const *
*/

auto와 함께 const, volatile, 포인터, 참조, r-value 참조를 사용할 수 있습니다. 컴파일러가 값의 형식을 추론한 정보를 사용하여 계산합니다.

 

auto는 등호를 이용한 초기화, 함수 스타일의 직접 초기화, new 연산자 이용, 범위 기반 for문의 매개변수로 초기화 될 수 있습니다. 

#include <iostream>
#include <typeinfo>

using namespace std;

int main()
{
	auto a = 5;
	auto b(7.7);
	auto* c = new auto('c');
	
	cout << "a의 type : " << typeid(a).name() << endl;
	cout << "b의 type : " << typeid(b).name() << endl;
	cout << "c의 type : " << typeid(c).name() << endl;

	int arr[] = { 1,2,3,4 };

	for (auto i : arr)
	{
		cout << i;
	}
}

/*
실행결과
a의 type : int
b의 type : double
c의 type : char *
1234
*/

 

참고자료 : https://docs.microsoft.com/en-us/cpp/cpp/auto-cpp?view=vs-2019

 

auto (C++)

auto (C++) In this article --> Deduces the type of a declared variable from its initialization expression. Note The C++ standard defines an original and a revised meaning for this keyword. Before Visual Studio 2010, the auto keyword declares a variable in

docs.microsoft.com

 

728x90

'Programming > C++' 카테고리의 다른 글

C++ 디폴트 매개변수  (0) 2020.02.06
C++ reference value(참조형 변수)  (0) 2020.02.04
C++ new, delete  (0) 2020.01.20
C++11 decltype  (0) 2020.01.20
C++ const, mutable  (0) 2020.01.10
728x90

서버와 클라이언트가 서로 양방향 통신을 하기 위해서는 Thread를 사용해야 합니다.

먼저 서버 코드입니다.

#tcpserver.py

from socket import *
import threading
import time

def send(sock):                 # 데이터 송신 함수
    while True:
        sendData = input(">>>")
        sock.send(sendData.encode("utf-8"))

def recv(sock):                 # 데이터 수신 함수
    while True:
        data = connectionSocket.recv(1024)
        print("상대방 ", data.decode("utf-8"))

host = "127.0.0.1"
port = 12345

serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind((host,port))
serverSocket.listen(1)
print("대기중입니다")

connectionSocket,addr = serverSocket.accept()

print(str(addr),"에서 접속되었습니다.")

sender = threading.Thread(target=send, args=(connectionSocket,))            # 송신 쓰레드
receiever = threading.Thread(target=recv, args=(connectionSocket,))         # 수신 쓰레드

sender.start()
receiever.start()

while True:
    time.sleep(1)   # thread 간의 우선순위 관계 없이 다른 thread에게 cpu를 넘겨줌
    pass            # sleep(0)은 cpu 선점권을 풀지 않음

serverSocket.close()                                    # 서버 닫기

다음은 클라이언트 코드입니다.

# tcpclient.py

from socket import *
import threading
import time

def send(sock):
    while True:
        sendData = input(">>>")
        clientSocket.send(sendData.encode("utf-8"))

def recv(sock):
    while True:
        data = clientSocket.recv(1024)
        print("상대방 : ", data.decode("utf-8"))

ip = "127.0.0.1"
port = 12345

clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((ip,port))

print("접속 완료")

sender = threading.Thread(target=send, args=(clientSocket,))
receiver = threading.Thread(target=recv, args=(clientSocket,))

sender.start()
receiver.start()

while True:
    time.sleep(1)
    pass

clientSocket.close()

728x90

'Programming > Python' 카테고리의 다른 글

Python TCP 소켓 프로그래밍하기  (0) 2020.01.13
Python 예외 처리하기  (0) 2020.01.10
Python 모듈 사용하기(random, datetime, time)  (0) 2020.01.10
Python class 사용하기  (0) 2020.01.10
Python 터틀 그래픽 사용하기  (0) 2020.01.09
728x90

TCP 소켓 프로그래밍에서 서버와 클라이언트가 동작하는 방식은 아래와 같습니다.

Server socket

  • socket(AF_INET, SOCK_STREAM) : 소켓 객체 생성

  • socket.bind(address) : 생성한 소켓을 서버 IP 및 포트를 튜플 형태로 맵핑

  • socket.listen() : 연결 요청 대기 상태 설정

  • socket.accept() : 연결 승낙 후 실제 통신 소켓 반환

  • socket.send(byte) or socket.sendall(byte) : 데이터 송신

  • socket.recv(bufsize) : 데이터 수신. bufsize는 한번에 수신되는 데이터 크기

  • socket.close() : 연결 종료

Client socket

  • socket.connect(address) : 서버 소켓에 연결 요청. 인자로 address를 튜플 형태

  • socket.send(byte) or socket.sendall(byte) : 데이터 송신

  • socket.recv(bufsize) : 데이터 수신. bufsize는 한번에 수신되는 데이터 크기

#tcpserver.py

from socket import *

host = "127.0.0.1"
port = 12345        # 임의번호

serverSocket = socket(AF_INET, SOCK_STREAM)             # 소켓 생성
serverSocket.bind((host,port))                          # 생성한 소켓에 설정한 HOST와 PORT 맵핑
serverSocket.listen(1)                                  # 맵핑된 소켓을 연결 요청 대기 상태로 전환
print("대기중입니다")

connectionSocket,addr = serverSocket.accept()           # 실제 소켓 연결 시 반환되는 실제 통신용 연결된 소켓과 연결주소 할당

print(str(addr),"에서 접속되었습니다.")                  # 연결 완료했다고 알림

data = connectionSocket.recv(1024)                      # 데이터 수신, 최대 1024
print("받은 데이터 :", data.decode("utf-8"))             # 받은 데이터 UTF-8

connectionSocket.send("I am a server".encode("utf-8"))  # 데이터 송신
print("메시지를 보냈습니다.")

serverSocket.close()                                    # 서버 닫기

# tcpclient.py

from socket import *

ip = "127.0.0.1"
port = 12345

clientSocket = socket(AF_INET, SOCK_STREAM)			# 소켓 생성
clientSocket.connect((ip,port))					# 서버와 연결

print("연결 확인됐습니다.")
clientSocket.send("I am a client".encode("utf-8"))		# 데이터 송신

print("메시지를 전송했습니다.")
data = clientSocket.recv(1024)					# 데이터 수신

print("받은 데이터 : ",data.decode("utf-8"))
clientSocket.close()						# 연결 종료

실행결과

서버 소켓 생성
클라이언트 접속 데이터 송수신 및 종료
서버 데이터 송수신 후 종료

728x90

'Programming > Python' 카테고리의 다른 글

Python 채팅 프로그램 만들기  (0) 2020.01.13
Python 예외 처리하기  (0) 2020.01.10
Python 모듈 사용하기(random, datetime, time)  (0) 2020.01.10
Python class 사용하기  (0) 2020.01.10
Python 터틀 그래픽 사용하기  (0) 2020.01.09

+ Recent posts