300x250
반응형

https://gocoder.tistory.com/714#comment14373886

 

에디터플러스 - 소스 코드 정렬기능 사용하기

editplus HTML 소스 정렬 기능 설정 안녕하세요. 고코더 입니다. 에디터플러스의 아쉬운 기능이 두가지 있다면 소스 자동 완성과 정렬 기능 부재가 없다는게 큰 단점이었습니다. 그런 기능 덕분에

gocoder.tistory.com

 

300x250
반응형

'기타 > 링크' 카테고리의 다른 글

그래픽 비교 사이트  (0) 2022.12.12
CPU 비교 사이트  (0) 2022.12.12
3D 툴  (0) 2022.11.01
C#으로 OpenGL 및 ImGUI 학습 2.5개월 경과 쇼케이스  (0) 2022.10.31
3D 모델 사이트  (0) 2022.10.28
300x250
반응형

 

 

 

 

 

이번 내용은 OpenGL을 윈도우 창과 연동하는 방법을 작성하였습니다.

 

주 내용은 간단합니다.

예제 파일에 있는 GlRender.cpp, GlRender.h 파일을 사용해서 

GlRender클래스는 자체 OpenGLCreate 관련 함수와, 쓰레드 생성 함수들이 있습니다.

나중에 GlStart()를 호출하게되면 MFC 화면에 영상이 출력됩니다.

 

RenderTest라는 클래스를 만들었습니다.

 

 

RenderTest.h

#pragma once
#include "GlRender.h"

class RenderTest : public GlRender
{
public:
    RenderTest();
    ~RenderTest();
    
private:
    void GlInit() override;
    void GlDraw() override;
};

헤더는 GlRender를 상속받습니다.

GlRender 클래스에 가상함수로 호출되기 때문에 GlInit(), GlDraw() 함수는 오버라이드! 

 

RenderTest.cpp

#include "stdafx.h"
#include "RenderTest.h"


RenderTest::RenderTest(){}

RenderTest::~RenderTest(){}

void RenderTest::GlInit(){}

void RenderTest::GlDraw()
{
    glViewport(0, 0, gl_window_width, gl_window_height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrtho((double)-gl_window_width / 2, (double)gl_window_width / 2,
        (double)-gl_window_height / 2, (double)gl_window_height / 2,
        1, -1);


    glMatrixMode(GL_MODELVIEW);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0, 0, 0, 0);


    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glPushMatrix();
    {
        glBegin(GL_LINES);

        glColor4f(0, 1, 0, 1);
        glVertex2d(0, 0);
        glVertex2d(200, 100);

        glEnd();
    }
    glPopMatrix();
    glDisable(GL_BLEND);



    glMatrixMode(GL_MODELVIEW);
    glMatrixMode(GL_PROJECTION);

}

 

RenderTest의 GlDraw() 함수 내용을 보면

중요한 내용은 아니지만 대략적으로 설명을 해보겠습니다.

 

1. glViewport를 사용하여 그릴 화면 영역을 잡고

2. 공간 메트릭스 행렬 초기화

3. glOrtho를 사용하여 화면 Viewport 영역 좌표계를 설정 했습니다.

4. GL_BLEND를 사용하여 투명도 적용

 

GlBegin ~ GlEnd() 내용에 색상을 정하고, 점2개로 직선을 그리는 OpenGL 코드를 작성하였습니다.

 

 

이제 MFC 화면에 연동을 해볼께요

 

0. stdafx.h에 OpenGL 환경설정 추가

#pragma comment ( lib, "OpenGL32.lib" )

#ifdef _WIN32
#include "OpenGL_lib/core/x86/glew.h"
#include "OpenGL_lib/core/x86/wglew.h"
#endif

#ifdef _WIN64
#include "OpenGL_lib/core/x64/glew.h"
#include "OpenGL_lib/core/x64/wglew.h"
#endif

 

1. 먼저 출력할 Dialog 클래스 헤더에 객체 선언

    RenderTest m_render_test;

 

2.  OnInitDialog() 함수에

m_render_test.Create(this);
m_render_test.GlStart();

 

3. OnSize() 함수에

m_render_test.GlResize(cx, cy);

 

4. OnClose() 함수에

m_render_test.GlClose();

 

 

프로그램을 실행한 결과!

 

예시 코드는 아래에서 받을 수 있습니다.

1. Example_OpenGL_MFC.zip
8.23MB

VisualStudio 2012에서 작성되었습니다.

300x250
반응형
300x250
반응형

 

위와 같이 개인 블로그에 예제를 넣을 수 있습니다.

https://codepen.io/muzimuzi/pen/poyQRvX?editors=1111 

 

flex modal

...

codepen.io

 

300x250
반응형
300x250
반응형

 

 

https://happybono.wordpress.com/2017/07/25/visual-studio-%EC%9D%98-%EC%88%A8%EA%B2%A8%EC%A7%84-%EA%B8%B0%EB%8A%A5-1-toolbox-%EB%8F%84%EA%B5%AC-%EC%83%81%EC%9E%90-%EC%97%90-%EC%86%8C%EC%8A%A4-%EC%BD%94%EB%93%9C-%EC%A1%B0%EA%B0%81-%EB%B3%B4/

 

Visual Studio 의 숨겨진 기능 1 : Toolbox (도구 상자) 에 소스 코드 조각 보관하기

[도구 상자의 소스 코드 조각 보관 기능 활용하기] Visual Studio 의 Toolbox (도구 상자) 에 특정 소스 코드를 보관하고, 해당 코드를 선택하여 코딩 시 필요한 곳에 삽입하실 수 있습니다. 해당 기능은

happybono.wordpress.com

 

300x250
반응형
300x250
반응형

UDP Multicast 테스트 프로그램 입니다.

1. 전송할 랜카드를 선택해 주세요(중요)

2. IP, PORT 입력 후 연결 클릭

3. 하단에 전송할 내용 입력 후 송신을 누르면 됩니다.

 

UDP Multicast 아이피 범위는 시작이 224 ~ 239로 시작해야 합니다.

(프로그램은 visual studio 2015로 제작되었습니다.)

 

 

 프로그램 다운로드(아래) 

Multicast Test.zip
0.07MB

 

 

[ 랜카드 목록 검색]

#include <iphlpapi.h>
#pragma comment(lib, "iphlpapi.lib")
#include <vector>

    std::vector<std::string> vector_ethernet;
    std::vector<std::string> vector_ip;


    // 현재 연결된 인터넷에서 검색
    PIP_ADAPTER_INFO pAdapterInfo;
    pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));
    ULONG buflen = sizeof(IP_ADAPTER_INFO);

    if (GetAdaptersInfo(pAdapterInfo, &buflen) == ERROR_BUFFER_OVERFLOW) {
        free(pAdapterInfo);
        pAdapterInfo = (IP_ADAPTER_INFO *)malloc(buflen);
    }

    if (GetAdaptersInfo(pAdapterInfo, &buflen) == NO_ERROR) {
        PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
        while (pAdapter)
        {
            vector_ethernet.push_back(pAdapter->Description);
            vector_ip.push_back(pAdapter->IpAddressList.IpAddress.String);

            pAdapter = pAdapter->Next;
        }
    }

위의 코드 적용 시

vector_ethernet 에는 랜카드 이름이

vector_ip 는 랜카드 ip가 추가됩니다.

 

 

 

 

[ 랜카드 선택]

IN_ADDR localaddr;
localaddr.s_addr = inet_addr(find_address.c_str());
int result_select = setsockopt(socket_, IPPROTO_IP, IP_MULTICAST_IF, (char*)&localaddr, sizeof(localaddr));

IP_ADD_MEMBERSHIP 을 사용해서 그룹에 조인 후에 사용해야 합니다.

 

 

아래 연결하는 풀 코드를 확인해 보세요

#include <string>
#include <WS2tcpip.h>

#include <iphlpapi.h>
#pragma comment(lib, "iphlpapi.lib")

 

SOCKET socket_;
SOCKADDR_IN sock_addr{};
struct ip_mreq mreq{};

bool NetFrame::Create(const std::string &a_ip, const int a_port, const std::string &select_ip)
{
    bool result = false;

    closesocket(socket_);

    int nSocketType = SOCK_DGRAM;
    socket_ = socket(PF_INET, nSocketType, 0);

    if (socket_ != INVALID_SOCKET)
    {
        sock_addr.sin_family = AF_INET;
        sock_addr.sin_port = htons(static_cast<u_short>(a_port));
        sock_addr.sin_addr.s_addr = INADDR_ANY;

        int optval = 1;

        setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR, (char*)&optval, sizeof(optval));

        if (bind(socket_, reinterpret_cast<SOCKADDR*>(&sock_addr), sizeof(sock_addr)) == 0)
        {
            result = true;

            if (false) // 내가 송신한 데이터는 안들어 오도록 설정
            {
                // https://wiki.kldp.org/HOWTO/html/Multicast/Multicast-HOWTO-6.html
                char loop = 0;
                int ret_val = setsockopt(socket_, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop));
            }

            //
            // Multicast 이더넷 선택 로직
            //
            //1. 멀티캐스트 라우터 테이블 추가
            mreq.imr_multiaddr.S_un.S_addr = inet_addr(a_ip.c_str());
            if (select_ip.empty())
                mreq.imr_interface.s_addr = htonl(INADDR_ANY);
            else
                mreq.imr_interface.s_addr = inet_addr(select_ip.c_str());
            int result_join = setsockopt(socket_, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq));
            if (result_join < 0)
                result = false;

            //2. 통신 인터페이스 선택(어떤걸 사용할 것인가)
            if (select_ip.empty() == false)
            {
                IN_ADDR localaddr;
                localaddr.s_addr = inet_addr(select_ip.c_str());
                int result_select = setsockopt(socket_, IPPROTO_IP, IP_MULTICAST_IF, (char*)&localaddr, sizeof(localaddr));
                if (result_select < 0)
                    result = false;
            }
        }

        inet_pton(sock_addr.sin_family, a_ip.c_str(), &sock_addr.sin_addr.s_addr);
    }

    return result;
}


std::string ip

std::ethernet_ip;
int net_port; 

 

Create(ip, port, ethernet_ip);

 

 

 

 

[ Wireshark로 전송 및 수신 확인]

랜카드 선택하는 부분은 예를들어 노트북에 랜카드가 연결되어있고 Wifi

이렇게 이더넷이 2개 연결된 상태에서

 

랜은 선택하는 설정을 안하면 멀티캐스트 전송 시

둘다 전송하는게 아니라 제일처음 전송한 2개중 1개로 계속 전송 하는 문제가 있습니다.

아래 그림처럼 이더넷, 이더넷 4 중 한곳으로 전송 됩니다.

 

이더넷 을 더블클릭 하시면 앞에 파란 버튼을 누르면 패킷 캡쳐가 시작됩니다.

udp로 검색을 하시면 UDP 데이터만 보여지게 되는데

아래 목록을 더블클릭 하시면 새창으로 정보를 확인할 수 있습니다.

 

아래 그림 처럼 Wireshark로 데이터 패킷을 확인해 보시면 어디로가는지 확인할 수 있습니다.

 

 

[기타 OS 없는 장비 전송 방법]

Dst 부분에 IPv4mcast로 되어 있어야 멀티 캐스트 전송입니다.

Dst Mac Adress는 01:05:5e 까지 나와야 합니다.

 

(OS가 있는 컴퓨터가 아닌 다른 펌웨어 기반 장비 개발은 아래와 같이 송신 아이피로 MAC Adress를 입력해줘야 전송이 되더라구요)

Mac Adress 계산은 

http://www.dqnetworks.ie/toolsinfo.d/multicastaddressing.html 사이트에서 보시면 될것 같습니다.

 

 

 

 

 

[정보가 도움이 되셨다면 광고 배너 클릭이 글쓴이의 활력이 됩니다.]

감사합니다.

 

 

 

 

 

300x250
반응형

+ Recent posts