본문 바로가기
IT기술(코딩)/C, C++

C++, C# zmq.hpp 통신 예제 socket.send, socket.recv, client.SendFrame, client.ReceiveFrameString

by 크리에이트매이커 2022. 4. 13.
반응형

안녕하세요. zmq통신 관련해서 예제 드리겠습니다.

저는 C# 과 C++간 통신이 필요해서 문답 주고받는 형식의 코드를 작성 했습니다.

이때 C++ 에서 디버그, 컴파일을 할때 4996 에러가 발생한다면,

프로젝트 -> 속성 -> 구성속성 -> C/C++ -> 고급 -> 특정경고 사용안함에 -> 4996을 넣어주시길 바랍니다.

zmq.hpp가 설치가 됐다는 가정하에 있는 코드입니다.

zmq.hpp설치 방법은 다른 구글에 정보가 많으니 참고하시면 될것 같습니다.

 

 

 

<<<C++>>>

#include<string>
#include<zmq.hpp>
#include <iostream>
#include <windows.h>

using namespace std;

int main() {
zmq::context_t ctx (1);
zmq::socket_t sock(ctx, ZMQ_REP);
sock.bind("tcp://127.0.0.1:30000");


    while (true) {
        zmq::message_t request;
        
        sock.recv(&request);
        if (request.str().find("Hi") != string::npos) {
            Sleep(1);
            zmq::message_t reply(5);
            memcpy(reply.data(), "Hello", 5);
            sock.send(reply);
        }else if (request.str().find("TurnOff") != string::npos) {
            Sleep(1);
            std::cout << "Received Hello : " << request.str() << std::endl;
            zmq::message_t check(3);
            memcpy(check.data(), "yes", 3);
            sock.send(check);
        }else if (request.str().find("good") != string::npos) {
            Sleep(1);
            //프로그램들 종료

            //종료 완료되면 
            std::cout << "Received Hello : " << request.str() << std::endl;
            zmq::message_t check(4);
            memcpy(check.data(), "done", 4);
            sock.send(check);
        }
        else if (request.str().find("updatedone") != string::npos) {
            Sleep(1);
            //프로그램 재 실행 (와치독실행)

            //실행 했으면
            std::cout << "Received Hello : " << request.str() << std::endl;
            zmq::message_t check(13);
            memcpy(check.data(), "watchdog_done", 13);
            sock.send(check);
        }


        
    }
    return 0;

}

 

끝.. C++ 에서의 zmq는 문자열을 받았을때, 받은 문자열을 표현하기 위해서 message_t 에서 받은 변수에 .str()을 해줘야 문자열로 표현이 됩니다.

 

<<<C#>>>

using ZeroMQ;
using System.Threading;
using NetMQ.Sockets;
using NetMQ;
using System.Text;

// See https://aka.ms/new-console-template for more information
Console.WriteLine("");


using (var client = new RequestSocket())
{
    client.Connect("tcp://127.0.0.1:30000");
    NetMQMessage msg1 = new NetMQMessage();
    msg1.Append("Hi", Encoding.UTF8);
    client.SendFrame(msg1.ToString());
    string msg = client.ReceiveFrameString();
    Console.WriteLine("From client: {0}", msg);
    
    if (msg == "Hello")
    {
        client.SendFrame("TurnOff");
    }

    string msg2 = client.ReceiveFrameString();
    if (msg2 == "yes")
    {
        client.SendFrame("good");
    }

    string msg3 = client.ReceiveFrameString();
    if (msg3 == "done")
    {
        //업데이트 시작

        // 끝나면 또 보내
        client.SendFrame("updatedone");
    }
    string msg4 = client.ReceiveFrameString();
    if (msg4 == "watchdog_done")
    {
        //UI에 완료 표시
        Console.WriteLine("From client: {0}", msg4);
    }
}

 

C# 의 zmq통신은 C++보다 비교적으로 쉽습니다.

결과 콘솔창 입니다. 오른쪽이 C++, 왼쪽이 C# 입니다.

세부 설명이 필요하면 댓글 달아주세용!!

반응형