안녕하세요. 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++보다 비교적으로 쉽습니다.
세부 설명이 필요하면 댓글 달아주세용!!
'IT기술(코딩) > C, C++' 카테고리의 다른 글
C# design Form 에서 ZMQ 통신 하기 Client (0) | 2022.06.16 |
---|---|
C++ MFC 10진법, 16진법 변환 (0) | 2022.05.23 |
C++, MFC 현재 프로젝트, 실행파일 실행한 경로 가져오기. (1) | 2022.01.19 |
MFC 출력 값 log표출 하기 안드로이드 스튜디오 log.d() 처럼 콘솔창에 debug값 출력하기, 테스트 값 확인하기 (0) | 2021.12.08 |
C, C++ win32 파일 만든 날짜, 수정한 날짜, 액세스한 날짜 수정하는 소스코드 (0) | 2021.12.01 |