Java - C++之MFC的TCP通讯

业务场景需求

标题:Java - C++之MFC通讯

1 业务场景描述

本人岗位背景:Java开发菜狗一条;

业务描述:需要对接各大厂家的设备;

对接信息:对方只提供了x86的库文件给我;

我他喵的,我哪会啊…被迫学习。

2 解决方案

目前有如下但不局限于这些的解决方法

  • 方案一:通过 Windows rundll32.exe执行x86库文件;
  • 方案二:使用Python做接口暴露;
  • 方案三:使用C++做接口暴露;

本文采取了方案三。

3 技术点

主要分为三个部分

  1. C++ / Java的异步多线程
  2. C++ MFC框架的使用
  3. C++ / Java的TCP通讯

我们根据上述的思路开始下面的打码。

一、C++代码

提示:这里可以添加本文要记录的大概内容

1 编译环境的部署

首先必须将所需要的模块进行安装,如MFC等。

这一块就不大想说太多了,如图所示。

2 完整代码片段

先上代码再说

// MatrixSDKTestDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "MatrixSDKTest.h"
#include "MatrixSDKTestDlg.h"
#include "afxdialogex.h"
#include <vector>
#include <sstream>

//获取地址信息
#include <WINSOCK2.H>
#include <WS2TCPIP.H>
#pragma comment (lib, "WS2_32.lib")
 

// 关于TCP的...
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include "winsock2.h"
#include<cstdlib>
#include <thread> // 这个用于多线程开辟
using namespace std;
char recvBuf[100];
bool connectStatus = false;
SOCKET sockConn;
// ...over
#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// ...此处省略无关文章的业务
// ...


/ 功能枚举 /
const CString code_100001 = "100001";// 初始化
const CString code_100002 = "100002";// 代表XXX功能
const CString code_100003 = "100003";// 代表XXX功能
const CString code_100004 = "100004";// 代表XXX功能
const CString code_100005 = "100005";// 代表XXX功能

/ TCP程序 /

// 切割方法
vector<string> split(string s, char token) {
   
	stringstream iss(s);
	string word;
	vector<string> vs;
	while (getline(iss, word, token)) {
   
		vs.push_back(word);
	}
	return vs;
}

/**
 * TCP
 * 在一个新的线程里面接收数据
 */
DWORD WINAPI Fun(LPVOID lpParamter)
{
   
	while (true) {
   
		memset(recvBuf, 0, sizeof(recvBuf));
		//接收数据
		recv(sockConn, recvBuf, sizeof(recvBuf), 0);
		printf("%s\n", recvBuf);
		// 数据处理代码 - 根据过来的消息分配函数 - 处理的比较无脑简单
		CString strCode = recvBuf;
		// 初始化 字符串切割
		string s1First = strCode;
		vector<string> sData = split(s1First, ',');
		if (strCode.Find(code_100001) != -1) {
   
			// 初始化
			string ipAddr = sData[1];
			char* ipAddr_char = (char*)ipAddr.data();
			unsigned short wLocalPort = 5060;
			// 执行初始化动作
			bool bRt = InitDevice(ipAddr_char, wLocalPort);
			if (bRt)
			{
   
				send(sockConn, "初始化成功", sizeof("初始化成功"), 0);
			}
			else
			{
   
				send(sockConn, "初始化失败", sizeof("初始化失败"), 0);
			}
		}
		else if (strCode.Find(code_100002) != -1) {
   
			// ...
		}
		else if(strCode.Find(code_100003) != -1){
   
			// ...
		}
		else {
   
			int iSendDDD3 = send(sockConn, "-1", 2, 0);
		}
		
		// 消息回复 Demo
		//char sendbuf[] = "你好,我是服务端,我已经收到了你的消息";
		// 消息发送 Demo --- 如果回去的数据长度不够 看看是否是第三个参数限制太短了
		//int iSend = send(sockConn, sendbuf, sizeof(sendbuf), 0);
	}
	closesocket(sockConn);
}

int startUpTCP()
{
   
	WSADATA wsaData;
	int port = 12022;// 端口号
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
	{
   
		printf(
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值