컴퓨터 19

[C] C언어 멀티 프로세스 채팅 서버 만들기

지난번에 멀티 스레드 채팅 서버를 만든 적이 있다. (궁금하면 여기를 참고) 이번 포스팅은 멀티 프로세스 채팅 서버를 C로 구현해봤다. (사실 친구의 수업에서 진행하는 프로젝트인데 재미있어 보여서 따라 했다.) C언어 + fork의 조합 때문에 전체적인 코드가 길어지기 때문에 주요 로직에 대해서만 정리를 해야겠다. 서버 코드 서버의 코드에서 사용한 공유 메모리 종류이다. 전체적인 채팅 알고리즘을 아래와 같이 설계했다. - 메세지 헤더, 메세지 유저, 메세지 데이터에 해당하는 공유메모리 영역을 선언한다. - 메세지 헤더에는 현재 메세지의 번호가 담기며, 코드를 실행하면 0으로 초기화된다. - 메인 코드 : 클라이언트 들의 접속을 허가하고 fork를 통해 채팅 알고리즘을 수행하는 프로세스를 생성한다. - 채..

[Go] 12. Go(golang)의 메소드(method)

이전 공부에서 golang의 구조체에 대해서 정리를 했었다. 오늘 정리할 내용은 구조체의 메소드에 관한 내용이다. 메소드 객체지향 언어에서 특정 속성들의 기능을 수행하기 위해 만들어진 특별한 함수를 "메소드"라고 한다. Go 언어는 객체지향 언어이지만 필드와 메소드를 묶어서 정의하는 클래스가 없다. Go 언어에서 메소드를 구조체 내부에서 정의하지 않고 구조체 밖에 일반 함수처럼 별도로 선언한다. Go언어의 메소드 Go언어에서 메소드를 선언하는 문법은 일반 함수를 선언하는 문법과 차이가 있다. - 기본 함수 선언 문법 func 함수 이름(매개변수 이름 매개변수형) 반환 형{ ` ` ` - 메소드 선언 문법 func (매개변수이름 구조체 이름) 메소드 이름() 반환형 { ` ` ` 메소드에서도 기본 함수에서..

[Python] 멀티 스레드 소켓 서버 구축하기

내가 한 번도 경험하지 못했던 "멀티 스레드 서버 프로그래밍"을 시작하기에 앞서 뼈대가 될 코드를 만들었다. 서버 코드 import socket import argparse import threading import time host = "127.0.0.1" port = 4000 def handle_client(client_socket, addr): print("접속한 클라이언트의 주소 입니다. : ", addr) user = client_socket.recv(1024) string = "안녕하세요? %s 님"%user.decode() client_socket.sendall(string.encode()) print("1초 후 클라이언트가 종료됩니다.") time.sleep(1) client_socket...

[Python] 파이썬 소켓 서버 프로그래밍

나는 개발자가 되기에 아직 많이 부족하다는 것을 느끼고 조금 더 열심히 살기로 다짐했다. 오늘은 파이썬으로 에코 서버를 TCP타입 소켓 통신을 통해 만들었다. 코드와 함께 간단한 주석으로 설명을 대체할 것이다. 사실 진짜 만들고 싶었던 건 내가 계속되는 질문에도 답을 못 했었던 스레드를 이용한 서버이다. 이번 건 맛 보기라는 뜻이다! 서버 코드 import socket host = "127.0.0.1" port = 9123 #IPv4 체계, TCP 타입 소켓 객체를 생성 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #포트를 사용 중 일때 에러를 해결하기 위한 구문 server_socket.setsockopt(socket.SOL_SO..

[Go] 10. Go(golang)의 익명 함수(Anonymous function)

이전 공부에서 golang의 함수에 대해서 정리를 했었다. 오늘 정리할 내용은 익명 함수에 관한 내용이다. 파이썬에서 Lambda와 비슷한 맥락이라고 봐도 될 것 같다. Go에서 익명 함수란? 익명 함수는 말 그대로 이름이 없는 함수이다. 함수는 하나의 큰 프로그램을 여러 부분으로 나누고, 여러 상황에서 여러 차례 호출할 수 있으며 일부분을 수정하기 쉽다는 장점을 가진다. 그렇다면 익명함수는 어떤 녀석이고 어떻게 호출할까? 익명함수는 그 자리에서 만들고 바로 그 자리에서 실행할 수 있다는 장점이 있다. 사실 익명 함수의 쓰임새는 말로 설명하는 것보다 직접 상황이 돼봐야 이해할 수 있을 것이다. (링크 - 실제로 내가 파이썬에서 익명 함수를 사용했던 경우이다.) Go에서 익명 함수의 형태는 함수의 이름만 ..

[DB][MySQL] pymysql을 사용하여 파이썬에서 DB 다루기

이번 포스트는 MySQL을 파이썬으로 다루기 위해 기본적인 pymysql 모듈의 사용법에 대해 정리해보려고 한다. pymysql 모듈 설치 pymysql을 모듈을 설치하는 방법이다. 간단하게 파이썬 모듈을 설치하던 방식으로 설치하면 된다. import pymysql connect = pymysql.connect(host='localhost', port=3306, user='root', password='********', db='JOO_DATA', charset='utf8') cursor = connect.cursor() sql = "select * from CS" cursor.execute(sql) print(cursor.fetchall()) 필자는 윈도우에서 docker를 이용해 MySQL환경을 만들..

[Go] 9. Go(golang)의 함수(func)

오늘 정리할 내용은 함수에 관한 내용이다. 특정 기능들을 기능별로 묶어서 구현하기 위해서 함수를 사용한다. 코드의 야이 줄어들고, 가독성도 좋아지고, 재사용 하기도 편리하다. 함수를 자주 호출하면 그만큼 오버헤드가 생긴다는 단점 말고는 사용하지 않을 이유가 없는 것 같다. Go언어의 함수 기본 문법 package main import "fmt" func func_1() { fmt.Println("매개변수와 반환값이 없는 함수를 실행하였습니다.\n") } func main() { func_1() } 매개변수와 반환 값이 없는 가장 기본적인 함수의 형태이다. 다른 언어들과 마찬가지로 가장 기본 문법에 조금씩 추가하면 반환 값과 매개변수를 갖는 함수를 선언할 수 있다. 여러 가지 변형된 함수를 정리한 코드를 ..

[DB][MySQL] 데이터베이스의 DCL(Data Control Language)

이번 포스트는 MySQL을 사용하여 데이터베이스의 DCL을 정리해보려고 한다. DCL이란 데이터베이스를 제어하는 명령어로 사용자 정보를 추가, 수정, 삭제 등을 하거나 권한을 설정할 때 사용한다. 사용자 정보 변경 기본 문법 1. 유저 생성 mysql> CREATE USER 'userid'@localhost IDENTITFIED BY '비밀번호'; mysql> CREATE USER 'userid'@'%' IDENTITFIED BY '비밀번호'; 2. 유저 비밀번호 변경 mysql> SET PASSWORD FOR 'userid'@'%' = '비밀번호'; 3. 유저 삭제 mysql> DROP USER 'userid'@'%'; 로컬에서만 접속할 수 있는 "localman"이라는 유저를 생성했다. 비밀번호도 변..

[C] C언어의 Stack_Frame

오늘은 스택 프레임에 대해 공부했다. 사실 이해하는데 정말 많은 시간이 걸렸는데 막상 공부하고 보니 그렇게 어려운 개념은 아닌 것 같다. 시작하기 전에.. 비주얼 스튜디오 2019를 통해 결과를 확인해보려 했는데, 디버그 옵션도 변경하고, 최적화 설정도 "사용 안 함"으로 바꿔줬는데 스택과 스택 사이에 예상하지 못한(?) 값이 계속 들어가서 아직도 실습을 못해보고 있다..ㅜ 제대로 된 설정을 찾게 되면 꼭 직접 테스트해보고 싶다. 아니면 우분투에서 GDB를 써서라도 꼭 확인해 볼 것이다. 스택 프레임 스택 프레임을 한 줄로 요약하자면, "함수 a가 호출되었을 때 그 함수가 가지는 공간(공간의 구조)"이다. 스택 영역을 함수가 어떻게 사용하는지 천천히 공부해보자. #include void func_a() ..

Computer_Language/C 2019.10.15

[Go] 8. Go(golang)의 맵(map)

오늘 정리할 내용은 맵(map)에 대한 내용이다. 맵은 슬라이스와 마찬가지로 참조 타입이다. 문법도 슬라이스와 유사하여 쉽게 공부할 수 있었다. Go언어의 맵 기본 문법 Go언어의 맵은 Python언어의 딕셔너리와 매우 유사하다. nil map이라는 개념이 있다는 것이 유일한 차이점인 것 같다. 코드를 통해 nil map을 선언해보고, 선언과 동시에 초기화도 해보자. package main import "fmt" func main() { var dict1 map[string]string if dict1 == nil { fmt.Println("this is nil map") } dict2 := map[string]string{ "name": "주성민", "age": "25", "birth": "950906..