레이블이 C#인 게시물을 표시합니다. 모든 게시물 표시
레이블이 C#인 게시물을 표시합니다. 모든 게시물 표시

2019년 7월 10일 수요일

C# TCP/IP 서버 만들기 (콘솔, 소켓통신)

일전에 C#으로 TCP/IP 서버를 만드는 포스트를 작성하긴 했지만


(윈폼 형태로 작성한 소켓 통신 서버 프로그램)

(윈폼 형태의 서버 프로그램 포스트 = 이동하기)

스레드도 들어가고 하니 소켓 통신만을 위한 소스만 필요한 분도 계실꺼 같아 소켓 통신 관련된 간단한 서버 프로그램도 하나 더 만들었습니다. ^^


이렇게 프로그램은 콘솔로만 실행되고 서버의 아이피와 포트 번호만 받아 바로 서버가 실행되도록 구성했습니다.

간단버전 서버 프로그램 다운로드 링크 = 다운로드
간단버전 서버 프로그램 소스코드 링크 = 다운로드

(다운로드 링크는 제가 작성한 프로그램을 바이러스 검사 후 구글 드라이브에 올린 링크입니다. 광고 없습니다~)


콘솔 앱 형태의 프로젝트를 생성한 뒤


요렇게 소스 코드를 작성하였습니다.


소켓 통신을 위한 기본 참조와


서버 정보가 될 IP와 포트 번호를 사용자에게 입력 받는 부분


TCP 리스너와 클라이언트를 활용한 서버 구성 부분

이 세가지로 나누어 지네요. ^^

읽어 주셔서 감사합니다!
Share:

2019년 7월 4일 목요일

Visual Studio에서 PDB 파일을 찾거나 열 수 없습니다 에러 해결 방법 (C,C++,C#,.NET)

비주얼 스튜디오를 사용해서 프로그램 작성하다보면 한번쯤은 겪을 에러인 PDB 파일에 대한 에러 해결방법에 대해 알아보겠습니다.


오늘도 역시 새 프로젝트를 하나 생성하고


시작 스레드에


가볍게 하나를 작성하고


디버깅을 실행하니


코드라곤 콘솔에 문자 한 줄 작성하는거 밖에 없는데 디버깅을 실행하지 못했다라는 메시지가 뜹니다.


당황한 마음과 함께 로그를 살펴보면 프로그램 로드는 문제 없지만 그 전에 어떤 dll 파일과 함께 PDB 파일을 찾을 수 없다는 메시지가 보이는데요.


디버깅은 안되지만 희안하게도 프로그램 로드는 잘만 되는 상황이 발생합니다.

이 문제는 비주얼 스튜디오가 프로젝트를 빌드하는 과정과 디버깅 하는 과정에 차이가 있기 때문인데요.

프로그램에 문제만 없으면 되는 빌드와는 달리 디버깅은 프로그램의 진행과정에 참조되는모든 소스들과 메모리 주소, 실제 값 등이 필요하기 때문에 이 어셈블리와 주소들을 찾아주거나 사용자가 알 수 있는 값으로 해석해 주는 해결사가 필요합니다.

PDB(Program Debug Database)은 이름 그대로 프로그램을 디버깅 할 때 필요한 이 정보들을 찾을 수 있는 키가 저장 되어 있는 파일인거죠.

PDB 파일이 없이 디버깅은 진행 할 수도 있겠지만 그렇게 되면 제대로 된 참조를 보지 못한다던가 어셈블리만 실컷 구경하게 될겁니다.

위에서는 이 PDB 파일을 생성하고 관리해줄 dll과 파일이 없었기 때문에 프로그램 로드에는 성공하였지만 디버깅에는 실패하는 결과로 이어졌던거죠.

비주얼 스튜디오 6.0 이전 버전을 쓰던 머나먼 옛날에는 모든 프로젝트에 설정을 따로 해줘야 했었지만 이후로는 이렇게 가끔식 마주하게 되는 문제가 되었습니다.

해결 방법은 굉장히 간단합니다.


비주얼 스튜디오의 메뉴 중 디버그 항목의 옵션으로 들어가서


기호 항목에 기호 서버의 체크가 풀려 있는데 이걸 체크하면

위와같이 로딩이 필요할 수 있다는 안내말이 나오고


서버를 체크한 뒤 확인을 하면


첫 디버깅때 이렇게 기호를 로드하기 위한 대기시간이 조금 필요하고


그 이후부턴 이렇게 기로 로드가 이루어집니다. ^^

이제 디버깅을 하면


요렇게 깔끔하게 디버깅을 하실 수 있습니다. ^^


디버그 폴더에도 이렇게 pdb 파일이 자리잡고 있네요. ㅎㅎㅎ
Share:

2019년 7월 3일 수요일

C#으로 TCP/IP 서버 만들기

이번에는 C#으로 TCP/IP 프로토콜을 지원하는 서버를 만들어 보겠습니다. ^^

통신 관련 프로그램을 작성할 때 테스트에 꼭 필요한 녀석이라 임시로 만들곤 했었는데 이번에 생각난김에 조금 정리한걸 블로그에 올려봅니다.

서버 실행 파일 다운로드 링크 - 다운로드
소스 코드 다운로드 링크 - 다운로드
(해당 다운로드 링크는 제 구글 드라이브에 공유된 파일이라 안전합니다.)

(콘솔 형태의 간단한 버전도 포스팅 되었습니다 - 이동하기)


일단 가볍게 윈폼 프로젝트를 만들어서 기본 레이아웃을 구성합니다.

레이아웃은 우선



서버를 구성할 아이피와 포트 번호를 입력 받을 부분과


서버 이벤트를 책임질 토글 스위치 부분, 마지막으로


서버 이벤트 로그와 결과 값을 표현할 로그 화면부로 구성해봤습니다. ^^

이제 핵심인 코드를 작성해 볼까요?

이번 코딩은 소켓 통신의 구성 요소들을 C#으로 표현하는 것과, 사용자로부터 입력 받고 로그를 표현하는 윈폼 프로그램의 메인 스레드, 서버를 운영 할 서버 스레드 간 분기와 동기화 부분에 중점을 두고 작성하였습니다.


그럼 주요 부분을 볼까요?


.NET에서 소켓 통신은 System.Net.Sockets에서 담당합니다.

스레딩도 함께 참조 했어요.


서버 구성에 필요한 변수들입니다.

TCP/IP 서버이니 Tcp리스너 하나 선언하고, 클라이언트로부터 받은 데이터를 담을 스트림 하나와 그 데이터를 변환시킬 byte 배열 하나도 필요합니다.

마지막으로 서버 운영을 담당할 스레드도 하나 만들었습니다.

그리고 서버의 안내말과 로그는


스트링 빌더를 하나 선언해서 길이 제한도 달고 해당 텍스트 박스에 이쁘게 보이도록 세팅합니다.

이제 뭔가를 로그창에 남기고 싶으면


요렇게 스트링 빌더를 세팅해주는 매서드를 호출시키면 됩니다. ^^

이러면 프로그램이 처음 실행되고 필요한 기본 세팅은 갖추어 졌네요.

이제 사용자가 서버 실행이나 종료를 위해 토글 스위치를 클릭했을 경우엔


요렇게 플레그 하나를 기준으로 서버 실행과 종료를 담당할 매서드를 만들고

서버를 실행할 매서드는


바로 서버 운영을 맡길 스레드를 시작 시키도록 합니다.


스레드는 서버 구성에 필요한 아이피와 포트 번호 정보를 가져와서 Tcp 리스너를 활성화 하고 필요한 로그와 세팅을 메인 스레드에 간섭하여 작성해줍니다.


그리고 해당 리스너에 클라이언트로부터 받은 데이터가 감지되면 바로 필요한 형태로 변환 시켜 로그창에 보이도록 하였습니다. ^^

이제 스레드나 리스너가 종료될때 까지 계속 서버는 실행되고 있겠죠.


서버를 종료 시킬 매서드는 우선 실행중인 리스너와 스트림의 잔여값 여부를 확인하고, Tcp 리스너와 해당 스레드를 종료시킴으로 서버 종료를 유도합니다.

좀 더 정밀한 작동을 원한다면 약간의 딜레이를 주고 확인하는 로직을 두면 될꺼 같네요.

서버가 종료되면 필요한 정보를 다시 로그 창에 작성시킴으로 매서드는 종료됩니다.


마지막 부분은 로그 창을 깨끗하게 정리해줄 버튼 이벤트와 데이터 변환에 필요한 매서드입니다.

Tcp 서버와는 상관 없는 부분이라서 아래로 빼두었습니다. ^^

이제 프로그램을 실행하면


요렇게 나오며


서버 오픈 클로즈 이벤트 잘 실행되고 로그도 이쁘게 찍히네요. ^^

Clear 버튼으로 로그 삭제도 무난이 작동합니다.


요녀석은 TCP/IP 프로토콜을 사용하는 클라이언트 프로그램인데요.

텍스트 파일을 읽어서 해당 내용을 서버에 전송하도록 만들었습니다.


요렇게 서버에 접속 시키고 전문을 전송하는 테스트를 하면


이쁘게 통신되는 모습입니다. ^ㅡ^

(테스트 영상입니다.)

다음편은 클라이언트로 찾아뵙겠습니다.

봐주셔서 감사합니다!
Share:

2019년 6월 26일 수요일

C#으로 단어 학습기 만들기 (엑셀, 일본어)

예전에 제가 일본어 공부 할 때 엑셀에 단어장을 만들고, 암기 테스트를 쉽게 하도록 도와주는 프로그램을 작성했었는데요.

이 프로그램을 블로그에 소스 코드와 함께 배포했었습니다.

(해당 포스트로 이동하기 - 엑셀 데이터를 이용한 단어 연습기 만들기)

그런데 이 학습기는 처음에 제가 학습할 용도로 만들었던 거라 별다른 기능이 없었으며, 다른 환경에서의 호환성도 문제가 있었습니다.

해당 포스트를 봐주시고 연습기를 이용해주신 독자분들의 피드백을 통해 프로그램의 수정이 필요하다 생각되어 이번 포스트를 작성하게 되었습니다.

전편의 단어 학습기는 엑셀 파일에 저장된 단어를 읽어와서 랜덤으로 제출하는 기능만 있었는데요.

(엑셀 파일에 있는 단어들을)

(랜덤하게 제출되는 단어를 보고 암기 학습)

랜덤으로 표시되는 단어의 뜻과 읽는법을 맞추고 다음 단어로 넘어가는 방식이었으며, 학습한 단어의 갯수나 정답률을 표시하는 기능이 있었습니다.

여기에


한자가 나오는 부분의 글자 크기를 조절하는 기능과 표시될 단어의 기준을 선택할 수 있는 기능

틀린 단어만을 모아 오답 노트 처럼 심화 과정을 진행 할 수 있는 기능

단어 출제 범위를 설정 할 수 있는 기능과 창 크기에 따른 비율 변경 기능들이 보강된 새로운 단어 연습기를 만들어 보겠습니다. ^^

그리고 기존의 실행 파일만 제공하는 방식에서 프로그램 설치 후 안정적인 환경에서 실행하는 방식으로 프로그램 배포 또한 다르게 하도록 하겠습니다.

코딩하기전 프로그램의 흐름을 간략히 나타내면
1. 사용자에게 단어장 위치 정보를 획득하고
2. 해당 위치의 단어장을 찾아 검사 후
3. 단어장의 데이터를 내부 메모리에 정리하고
4. 해당 메모리로 사용자에게 원하는 옵션에 맞춰 데이터 제공

크게 4단계의 로직이 있으며 프로그램 예상 레이아웃은

이전 단어장과 기본 골격은 동일하지만

단어 제출 기준을 정할 라디오버튼, 글자 크기와 범위를 입력받을 텍스트 박스가 상단에 들어가고, 오답 데이터 수집 여부를 확인할 토글 버튼과 학습기 상태를 바꿀 토글 버튼이 추가 됩니다.

그리고 글자 크기에 따라 한자 뿐만 아니라 순서와 뜻 부분까지 함께 적용되도록 하겠습니다.

마지막으로 단어학습기의 크기를 변경시킬 경우 순서, 한자, 뜻을 표시하는 이 세개의 텍스트 박스의 크기와 글자 크기만 변경되도록 할 계획입니다.

프로그램 작성하다보니 길이가 조금 길어져서 코드 공개와 설명을 합치면 너무 길어질꺼 같아 이번편에서는 대략적인 제작 과정만 올리고 코드 관련 내용은 이후 포스트로 올리겠습니다. ^^

(새 버전 단어연습기랑 단어장 다운로드 - 다운로드)

일단 단어연습기 프로그렘을 작성할 프로젝트를 생성하고


(프로젝트는 윈도우 호환을 위해 닷넷 버전을 4.5.2로 하였습니다.)

기왕 만드는김에 이번엔 다른 디자인을 적용해 볼까요?


도구 - 너겟 패키지 관리 - 솔루션용 너겟 패키지 관리로 들어가서


윈도우8부터 큰 호평을 받았던 메트로 타일 스타일을 제공하는 MetroModernUI를 받았습니다.


단어연습기를 작성할 프로젝트에 적용 동의를 하면


갓 비주얼 스튜디오께서 환경을 알아서 잡아주십니다.


참조에 메트로 UI 테마 관련 dll들이 세팅되어 있습니다.

수동으로 설정할 경우 위 dll들을 다운받아 참조 설정과 도구 세팅만 해주시면 바로 사용이 가능합니다.


저번 단어연습기는 윈도우 7에서 안되는 경우가 있었지만 이번엔 XP까지 호환 되도록 4.5.2로 세팅하였습니다. ^^


이제 본격적으로 코딩 시작이네요.


우선 메트로프레임워크 참조를 달고


윈폼을 메트로폼으로 바꿔주면


짜잔~


메트로폼은 스타일 속성에 타일 색상을 바꿀 수 있습니다.

이쁜 색상을 선택해서 실행해보면


기본 윈폼보단 훨씬 이쁘죠? ^^


(메트로UI용 도구들도 많습니다)

일단 기능 구현에 앞서 구도부터 잡아 볼까요?


이번 프로그램은 창 크기 조절이 많을 예정이라 컨트롤 위치와 크기 조절에 신경을 써야 하는데요. 저는 기능별로 층을 나눠 배치를 할 생각입니다.


위에서부터 각각의 판넬들은 대략 이런 컨트롤들이 들어갈 예정이죠.

그 중 단어 출력 부분을 담당할 판넬만 세로로 크기가 변경 가능하도록 설정 하였습니다.

이제 구도를 잡았으니 메트로UI를 활용해 컨트롤도 배치하면


짜잔~

확실히 기본 컨트롤들 보단 훨씬 이쁘네요. ^^

컨트롤들도 판넬과 마찬가지로 창 크기 변경에 따라 포지션이 달라지니 정렬 기준을 잘 잡아야 합니다.

정렬 기준을 잘 잡으면


이렇게 창 크기가 변경되도 비율에 맞게 컨트롤들이 잘 붙어 있게 되죠 ㅎㅎ


이제 단어연습기의 가장 핵심이 될 단어를 보여줄 레이블들의 위치를 잘 조절하고


테두리를 만든 다음


창 크기 변경 이벤트에 컨트롤들의 크기를 조절 해줄 로직과, 레이블의 글자 크기를 자동으로 맞출 로직을 작성하면


이제 창 크기 변경에 따라 버튼 크기와 단어 표시를 해주는 레이블, 글자 크기가 자동으로 바뀌며 맞춰집니다. ^ㅡ^

디자인을 완료하면



컨트롤들의 이벤트들을 하나씩 만들어 가고


단어장인 엑셀 파일을 읽기 위해 관련 dll을


참조하여


코드를 작성했는데...

작동은 잘 되었지만 테스트 과정에서


엑셀이나 오피스가 설치되지 않는 환경에서는 작동중 에러가 발생하더라구요... ㅠㅠ

그래서 엑셀을 로딩하는 부분을 위해


EPPlus를 설치하였습니다.


저도 이번에 처음 사용해봤는데 실행 환경에 오피스 설치 여부에 영향 받지 않고, 참조를 억지로 로딩할 필요도, xml을 이용한 별도의 로딩 과정도 필요없는 정말 좋은 패키지더라구요. ^^

코드 작성을 마친 뒤 배포를 위해


인스톨러 프로젝트를 만들었고


빌드 후 설치 파일도 완성!


설치 파일과 단어장, 설명서 모아 압축된 파일은 여기서 다운 받을 수 있습니다.

(새 버전 단어학습기, 단어장 다운로드 링크 = 다운로드)

제가 만든거라서 제 구글 드라이브 링크이며 다른 광고나 바이러스는 없습니다. ^^

파일을 받으셨으면 압축을 푸시고 설치 파일인 KanaApp1.msi을 실행하시면


요렇게 설치 마법사가 뜹니다.


설치를 원하시는 위치와 권한을 선택하고 다음으로 넘어가면


파일 배치만 하는 수준이라서 설치 시간은 매우 짧을꺼에요 ㅎㅎ

설치가 완료되면 바탕화면에


요렇게 단어연습기 바로가기 아이콘도 생성됩니다.

이걸 실행하면 단어연습기가 실행됩니다.

삭제하고 싶으시면 제어판 - 프로그램 삭제로 들어가서 단어연습기를 선택하시면

요렇게 삭제 마법사가 뜨고


매우 간단히 삭제가 되어집니다.

단어연습기 사용방법은

유튜브에 올린 영상이 있습니다.

00:13 에 아래 텍스트 박스에 마우스 클릭을 한 다음 부터는 키보드로 왼쪽, 오른쪽, 아래 화살표 키를 누르면 각각의 버튼들이 자동으로 실행되도록 하였습니다.

00:20 에서는 오답체크를 체크했는데요 이때부터 모르는 단어들은 따로 저장되어 있다가

00:28 때 오답노트로 변경 하면 오답 체크로 저장되었던 단어들만 제출되도록 하였습니다.

00:37 부터는 다시 일반 모드로 돌아옵니다. 일반 모드에서는 언제든지 오답 체크를 통해 모르는 단어 저장이 가능해집니다.

01:10 부터는 한자 크기 설정 부분을 설명하고 있습니다. 단어들 크기는 기본적으로 창 크기를 따라가지면 이렇게 임의의 크기로 고정할 수도 있도록 하였습니다. ^^

그리고 마지막으로 엑셀이 설치되지 않은 환경에서 실행을 해봤는 결과

엑셀이 설치되지 않거나 윈도우 7 32bit 환경에서도 무사히 실행되는 걸 확인했습니다. ^^

늦었지만 기다리셨거나 의견을 주신 독자분께 정말 감사드립니다.

긴 글 봐주셔서 감사합니다!
Share: