C++ 프로그램 중복 실행 방지 (윈도우 기반)

프로그래밍/C, C++|2021. 5. 18. 13:16
반응형

HANDLE Mutex;
const char ProgMutex[] = "Sysdocu"; // 프로젝트명
if ((Mutex = OpenMutex(MUTEX_ALL_ACCESS, false, ProgMutex)) == NULL)
    Mutex = CreateMutex(NULL, true, ProgMutex);
else {
    MessageBox(NULL, "이미 실행중입니다.", "알림", MB_OK);
    return 0;
}

 

 

반응형

댓글()

PHP 와 JWT (JSON Web Tokens)를 이용한 예제

프로그래밍/PHP|2021. 5. 17. 16:04
반응형

해당 예제는 CentOS 7 또는 8 에서 사용이 가능합니다.

관련 패키지와 환경 설정을 진행합니다.

 

1. Composer 설치

 

# yum -y update

# yum -y install php-cli php-zip wget unzip

# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

# HASH="$(wget -q -O - https://composer.github.io/installer.sig)" 

# php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

 

# php composer-setup.php --install-dir=/usr/local/bin --filename=composer

 

여기에서 아래와 같은 에러 메세지가 출력될 경우 패키지를 추가로 설치하고 진행하면 됩니다.

php 를 소스 컴파일 하신 경우 해당 옵션 (--disable-json) 을 제거하고 재컴파일 해야 합니다.

 

(에러)

Some settings on your machine make Composer unable to work properly.
Make sure that you fix the issues listed below and run this script again:

The json extension is missing.
Install it or recompile php without --disable-json

 

(해결)
# yum install php-json

 

composer 가 잘 설치되었는지 명령어로 확인해봅니다.

사용할 수 있는 옵션이 출력 될경우 정상 설치된 것입니다.

 

# composer

 

확인이 되었으면 설치 프로그램을 삭제 합니다.

 

# php -r "unlink('composer-setup.php');"

 

 

2. PHP-JWT 설치

 

composer require firebase/php-jwt

 

 

3. 테스트

 

# vi first.php

<?php
require_once './vendor/autoload.php';
use Firebase\JWT\JWT;
$secret_key = "this-is-the-secret";

// 데이터 입력
$id = "sysdocu";
$email = "sysdocu@sysdocu.tistory.com";
$addr = "seoul";
$phone = "010-1111-2222";
 
$data = array(
    'id' => $id,
    'email' => $email,
    'addr' => $addr,
    'phone' => $phone
);
 
$jwt = JWT::encode($data, $secret_key);
echo "encoded jwt: " . $jwt . "<br>";
 
//$decoded = JWT::decode($jwt, $secret_key, array('HS256'));
//print_r($decoded);
?>


생성한 php 파일을 웹브라우저로 불러오면 출력되는 결과는 아래와 같습니다.

encoded jwt 값을 자세히 보시면 hearderpayloadsignature 값 모두 출력되는 것을 볼 수 있습니다. (점으로 구분) 

 

encoded jwt: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6InN5c2RvY3UiLCJlbWFpbCI6InN5c2RvY3VAc3lzZG9jdS50aXN0b3J5LmNvbSIsImFkZHIiOiJzZW91bCIsInBob25lIjoiMDEwLTExMTEtMjIyMiJ9.xmYK1C0pnguCpC8qFUaJYYoLNnhkQ6kGiBxba_aM1gc

 

내용을 받을 php 를 만듭니다.

 

# vi second.php

 

<?php
require_once './vendor/autoload.php';
use Firebase\JWT\JWT;
$secret_key = "this-is-the-secret";

// URL 에서 jwt 인자값을 가져온다.
$jwt = isset($_GET['jwt']) ? $_GET['jwt'] : null;
if (isset($jwt)) {

    // validate jwt 로그인된 상태 
    try {
        $decoded = JWT::decode($jwt, $secret_key, array('HS256'));
        $decoded_array = (array)$decoded;
        $result = array(
            'code' => 200,
            'status' => 'success',
            'jwt_payload' => $decoded_array
        );
    } catch (\Exception $e) {
        $result = array(
            'code' => 0,
            'status' => 'error',
            'message' => $e->getMessage().' Invalid JWT - Authentication failed!'
        );
    }

} else {
    $result = array(
        'code' => 0,
        'status' => 'error',
        'message' => 'JWT parameter missing!'
    );
}
echo json_encode($result);
?>

 

그리고 브라우저에서 first.php 의 결과 코드를 활용해 second.php 로 접속해 봅니다.

 

http://{도메인}/second.php?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6InN5c2RvY3UiLCJlbWFpbCI6InN5c2RvY3VAc3lzZG9jdS50aXN0b3J5LmNvbSIsImFkZHIiOiJzZW91bCIsInBob25lIjoiMDEwLTExMTEtMjIyMiJ9.xmYK1C0pnguCpC8qFUaJYYoLNnhkQ6kGiBxba_aM1gc

 

 

[결과]

{"code":200,"status":"success","jwt_payload":{"id":"sysdocu","email":"sysdocu@sysdocu.tistory.com","addr":"seoul","phone":"010-1111-2222"}}

 

 

데이터가 잘 확인되었습니다.

필요에 따라 이 샘플 코드를 이용해 세션 파일을 만드는 등 추가 작업을 진행하면 됩니다.

 

 

상세 설명은 아래 URL 에서 확인 가능합니다.

[출처1 - 환경 설치 부분] https://phoenixnap.com/kb/how-to-install-and-use-php-composer-on-centos-7

[출처2 - 테스트 부분] https://trytoso.tistory.com/1024

https://heartgamer.wordpress.com/2015/08/26/json-web-tokenjwt%EB%A5%BC-node-js%EC%99%80-php%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/

 

 

 

반응형

댓글()

C++ 에서 구동 파일의 절대 경로 확인하기 (windows)

프로그래밍/C, C++|2021. 5. 17. 14:29
반응형

1. 구동 파일 절대 경로 출력 (파일)

 

char cCurrentPath[FILENAME_MAX];
GetModuleFileName(NULL, cCurrentPath, MAX_PATH);
cCurrentPath[sizeof(cCurrentPath) - 1] = '\0';
printf("The current working file is %s\n", cCurrentPath);

 

 

2. 구동 파일 절대 경로 출력 (디렉토리)

- 위 소스에서 코드 한줄만 더 추가하면 파일명이 제외된 디렉토리만 출력됩니다.

PathRemoveFileSpec(cCurrentPath);

printf("The current working directory is %s\n", cCurrentPath);

 

반응형

댓글()

(에러) 인수 1을(를) 'ATL::CString'에서 'const char *'(으)로 변환할 수 없습니다.

프로그래밍/C, C++|2021. 5. 14. 14:15
반응형

코드나 환경에 따라 아래와 같은 에러가 출력될 수 있습니다.

저는 디렉토리 이동 함수를 사용할때 메세지가 출력 되었습니다.

 

(에러)

'int _chdir(const char *)': 인수 1을(를) 'ATL::CString'에서 'const char *'(으)로 변환할 수 없습니다.

 

(해결)

이경우 아래와 같이 해주세요.

_chdir((char*)(LPCTSTR)strFolderPath);

 

 

반응형

댓글()

Windows C++ 로 시스템 DISK 사용률 출력하기

프로그래밍/C, C++|2021. 4. 22. 09:33
반응형

BOOL  fResult;

unsigned __int64 i64FreeBytesToCaller,

    i64TotalBytes,

    i64FreeBytes;

fResult = GetDiskFreeSpaceEx(L"C:",

    (PULARGE_INTEGER)&i64FreeBytesToCaller,

    (PULARGE_INTEGER)&i64TotalBytes,

    (PULARGE_INTEGER)&i64FreeBytes);

if (fResult)

{

    printf("Available space to caller = %I64u MB\n",

        i64FreeBytesToCaller / (1024 * 1024));

    printf("Total space               = %I64u MB\n",

        i64TotalBytes / (1024 * 1024));

    printf("Free space on drive       = %I64u MB\n",

        i64FreeBytes / (1024 * 1024));

}

 

[출처] https://stackoverflow.com/questions/11917946/how-do-i-get-available-disk-space-from-windows-using-c

반응형

댓글()

Windows C++ 로 시스템 메모리(MEM) 사용률 출력하기

프로그래밍/C, C++|2021. 4. 22. 09:28
반응형

 

MEMORYSTATUSEX memInfo;

memInfo.dwLength = sizeof(MEMORYSTATUSEX);

GlobalMemoryStatusEx(&memInfo);

DWORDLONG totalPhysMem = memInfo.ullTotalPhys; // 전체 메모리

DWORDLONG availPhysMem = memInfo.ullAvailPhys; // 남은 메모리

printf("MEM : %I64u %I64u\n", totalPhysMem / 1024, availPhysMem / 1024); // KB 로 출력

 

[참고] https://ospace.tistory.com/514

반응형

댓글()

Windows C++ 로 시스템 CPU 사용률 출력하기

프로그래밍/C, C++|2021. 4. 22. 08:53
반응형

#include <Windows.h>

#include <iostream>

using namespace std;

static float CalculateCPULoad();

static unsigned long long FileTimeToInt64();

float GetCPULoad();

int main()

{

    printf("%.1f", GetCPULoad()); // 소수점 1자리까지 출력

    return 0;

}

static float CalculateCPULoad(unsigned long long idleTicks, unsigned long long totalTicks)

{

    static unsigned long long _previousTotalTicks = 0;

    static unsigned long long _previousIdleTicks = 0;

    unsigned long long totalTicksSinceLastTime = totalTicks - _previousTotalTicks;

    unsigned long long idleTicksSinceLastTime = idleTicks - _previousIdleTicks;

    float ret = 1.0f - ((totalTicksSinceLastTime > 0) ? ((float)idleTicksSinceLastTime) / totalTicksSinceLastTime : 0);

    _previousTotalTicks = totalTicks;

    _previousIdleTicks = idleTicks;

    return ret;

}

static unsigned long long FileTimeToInt64(const FILETIME& ft) { return (((unsigned long long)(ft.dwHighDateTime)) << 32) | ((unsigned long long)ft.dwLowDateTime); }

// Returns 1.0f for "CPU fully pinned", 0.0f for "CPU idle", or somewhere in between

// You'll need to call this at regular intervals, since it measures the load between

// the previous call and the current one.  Returns -1.0 on error.

float GetCPULoad()

{

    FILETIME idleTime, kernelTime, userTime;

    return GetSystemTimes(&idleTime, &kernelTime, &userTime) ? CalculateCPULoad(FileTimeToInt64(idleTime), FileTimeToInt64(kernelTime) + FileTimeToInt64(userTime)) : -1.0f;

}

 

[출처] https://stackoverflow.com/questions/23143693/retrieving-cpu-load-percent-total-in-windows-with-c

 

반응형

댓글()

Visual Studio 2019 설치 (C / C++컴파일러) 및 몇가지 컴파일 에러 해결 방법

프로그래밍/C, C++|2021. 4. 19. 10:56
반응형

아래 URL 에서 Visual Studio 를 다운로드 할 수 있습니다.

https://visualstudio.microsoft.com/ko/thank-you-downloading-visual-studio/?sku=Community&rel=16

 

Installer 실행시 개발 종류에 대해 선택하는데 여기서는 'C++ 데스크톱 개발' 을 선택하고 설치하였습니다.

 

 

[ 사용해보기 - 예제 및 컴파일 ]

Visual Studio 가 설치 되면 실행을 하고 새 프로젝트 (빈 프로젝트) 를 생성합니다.

우측에 솔루션 탐색기가 있는데 그중 '소스 파일' 우클릭 후 '추가 > 새항목 > C++ 파일(.cpp)' 순서로 클릭합니다.

 

1) 예제

#include <stdio.h>

int main() {

    printf("hello world!");

    return 0;

}

 

2) 컴파일 방법

Ctrl + F5 를 누르면 컴파일이 되고, 명령프롬프트 창이 뜨면서 파일이 자동으로 실행되어집니다.

간단히 상단 메뉴중 '로컬 Windows 디버거' 버튼을 눌러도 됩니다. (64bit 실행 파일을 만들 경우 앞에 메뉴를 x64 로 선택)

 

컴파일 된 실행 파일은 아래 디렉토리에 있습니다.

C:\Users\{사용자명}\source\repos\{프로젝트명}\x64\Debug\{프로젝트명}.exe

 

 

* 참고

pthread 사용방법

https://wnsgml972.github.io/c/2018/05/07/c_windows_pthread/

 

socklen_t 코드 사용법

#include <WS2tcpip.h> 추가

 

strcpy 사용시

프로젝트 > 속성 > C/C++ (전처리기) > 전처리기 정의 에 '_CRT_SECURE_NO_WARNINGS' 추가

 

'timespec' 'struct' 에러 처리법

#define HAVE_STRUCT_TIMESPEC 추가

 

아래와 유사한 에러가 발생된 경우

에러 : LNK2019 __imp_acceptmain 함수에서 참조되는 확인할 수 없는 외부 기호

#pragma comment(lib, "ws2_32.lib") 추가

반응형

댓글()

Windows 에서 c 컴파일러 MinGW 설치하기

프로그래밍/C, C++|2021. 4. 19. 10:28
반응형

윈도우즈에서 gcc 명령을 사용하는 방법 입니다.

간편히 사용할 수 있으나 간혹 백신이 설치된 곳에서는 gcc 명령으로 컴파일 된 파일 실행시 바이러스로 구분 될 수 있으므로

(hello world 메세지를 출력하는 간단한 예제 파일도)

Visual Studio 로 설치하여 컴파일 하여 실행하면 백신에 걸리지 않습니다.

* Visual Studio 설치하기 : https://sysdocu.tistory.com/1639

 

 

1. 설치

윈도우즈에서 gcc 명령을 사용하기 위해 아래 URL 에서 최신 프로그램을 다운로드 합니다.

 

https://sourceforge.net/projects/mingw-w64/files/mingw-w64/ 

 

웹페이지 접속 후 스크롤을 조금만 내려보면 MinGW-W64 GCC-8.1.0 항목에
x86_64-posix-seh 라는 다운로드 링크가 있습니다.

설치하려는 시스템이 64bit 인 경우 이 파일을 다운로드 합니다.

 

압축 해제 후 생성된 mingw64 디렉토리를 임의의 위치로 옮겨 줍니다.

여기에서는 C:\mingw64 로 옮겼습니다.

 

 

2. 설정

설치 완료 후 

'내 PC' 우클릭 '속성' [시스템] > [고급 시스템 설정] > [환경 변수] > [시스템 변수] 의 'Path' 선택 후 '편집' 버튼을 누릅니다.

'C:\mingw64\bin' 경로를 추가하고 확인 버튼을 눌러 저장합니다.

 

 

3. 확인

[시작] > [실행] 을 눌러 'cmd' 입력, 엔터를 치고

명령 프롬프트에서 'gcc -v' 명령을 수행하면 gcc 버전이 출력되는 것이 확인됩니다.

 

반응형

댓글()

Ubuntu 18.04 내에서 안드로이드 (Android) 에뮬레이터 구동하기

프로그래밍/Android (Java)|2021. 4. 15. 09:27
반응형

에뮬레이터 공식 홈페이지 : https://anbox.io/

 

Android 테스트를 위해 리눅스에 Androud Emulator 를 설치하였습니다. (현재 Android 버전 : 7.1.1)

아래는 Ubuntu 18.04 에서 snap 을 이용하여 Anbox 를 설치하는 방법 입니다.

 


 1. 설치

Anbox Support PPA 를 등록합니다.

 

# add-apt-repository ppa:morphis/anbox-support
# apt -y update
# apt -y install linux-headers-generic anbox-modules-dkms
# modprobe ashmem_linux
# modprobe binder_linux

snap 을 이용해 Anbox 를 설치 합니다.

 

# apt -y install snap snapd

# snap install --devmode --beta anbox

 

우분투 '프로그램 표시' 에서 설치된 'Anbox Application manager' 를 볼 수 있습니다.

하지만 Google Play Store 가 보이지 않습니다.

아래 작업을 추가로 진행하면 아이콘이 추가되고 사용이 가능합니다.

 

 

2. 추가 작업 (Google Play Store)

 

# apt -y install curl wget lzip unzip squashfs-tools

# wget https://raw.githubusercontent.com/geeks-r-us/anbox-playstore-installer/master/install-playstore.sh

# bash install-playstore.sh

 

다시 'Anbox Application manager' 를 실행하면 Google Play Store 아이콘이 보이게 됩니다.

 

 

3. apk 파일 설치

apk 패키지 파일을 설치하는 방법은 아래와 같습니다.

# apt install android-tools-adb
# adb install my.apk    // 미리 다운로드 받은 파일을 설치합니다.

 

혹시 아래와 같은 에러를 만난 경우의 조치법입니다. -t 옵션을 추가하면 간단히 해결 됩니다.

# adb install my.apk

adb: failed to install my.apk: Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI]

 

# adb install -t my.apk

Success

 

다시 'Anbox Application manager' 를 실행하면 설치했던 앱이 보입니다.

 

반응형

댓글()

파일과 현재시간의 timestamp 구하기, 차이 계산하기

프로그래밍/BASH SHELL|2021. 3. 26. 08:06
반응형

특정 파일이 쓰여진 날짜의 timestamp 를 time_close 변수에 기록합니다.

time_close=`stat -c %Y /var/spool/mail/sysdocu`

 

현재시간 timestamp 를 time_now 변수에 기록합니다.

time_now=`date +%s`

 

두 값의 차이를 계산 합니다. (초)
time_diff=`expr $time_now - $time_close`

 

계산된 값을 출력합니다.

echo $time_diff

 

 

반응형

댓글()