c++和matlab通信机制

本文详细介绍了如何使用MATLAB作为客户端,C++作为服务器端,通过TCP/IP协议进行通信。C++服务器端代码展示了如何监听并处理来自MATLAB的连接请求,而MATLAB客户端代码则演示了如何发送和接收字符串。通过运行示例代码,可以在同一主机或局域网内实现双方的有效通信。

MATLAB和C++程序使用TCP/IP协议进行通信

有许多朋友希望使用Matlab作客户端(因为Matlab处理数据比较方便),C++程序作服务器,两者之间进行通讯。其中有些人会遇到问题,接收字串的格式总是出错,本篇文章就解释一下如何实现。
注意:此处的通信仍限制于同一主机或局域网内,否则需内网穿透,原因

1. C++程序:服务器端
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib,"Ws2_32.lib")
#include <memory.h>

#define BUF_SIZE 4096
#define QUEUE_SIZE 5
// 通信线程
DWORD WINAPI ThreadProcServerConmunicate(
In LPVOID lpParameter
) {
// 获得套接字指针
SOCKET * psc = (SOCKET *)lpParameter;

int receByt = 0;
while (1)
{
	char buf[BUF_SIZE];
	// 读取客户机发送来的消息,读不到数据就一直等待,连接中断返回0,发生错误返回-1
	receByt = recv(*psc, buf, BUF_SIZE, 0);
	buf[receByt] = '\0';
	if (receByt &gt; 0)
	{
		printf("%u : 接收的消息是:%s\n", *psc, buf);
		// 把接收到的消息发送回去
		send(*psc, buf, receByt, 0);
	}
	else
	{
		printf("接收消息结束!");
		break;
	}

}
//关闭套接字,释放空间
int ic = closesocket(*psc);
free(psc);
return 0;

}

int main() {
// 初始化windows sockets服务,使用2.0版本
WSADATA wsd;
WSAStartup(MAKEWORD(2, 0), &wsd);
// 建立TCP套接口,使用5174端口,绑定本地地址
SOCKET s = NULL;
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in ch;
memset(&ch, 0, sizeof(ch));
ch.sin_family = AF_INET;
ch.sin_addr.s_addr = INADDR_ANY;
ch.sin_port = htons(5174);
int b = bind(s, (struct sockaddr *) &ch, sizeof(ch));
// 开始监听,队列中最多有QUEQE_Size=5个等待
int l = listen(s, QUEUE_SIZE);
printf(“正在监听本机的5174端口\n”);

while (1) {
	// 接收等待队列中第一个客户机请求,建立连接
	SOCKET * psc = (SOCKET *)malloc(sizeof(SOCKET));
	*psc = accept(s, 0, 0);
	printf("一个客户端已经连接到本机的5174端口,SOCKET是 : %u \n", *psc);
	// 为连接建立新线程进行处理
	CreateThread(NULL,
		0,
		&amp;ThreadProcServerConmunicate,
		psc,
		0,
		NULL
	);
}
// 关闭套接口和服务
int is = closesocket(s);
WSACleanup();
return 0;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

注释应该是比较清晰的,一般都能看懂。看不懂的话,直接运行就可以。

2. MATLAB程序:客户端
%% 设置连接参数,要连接的地址为127.0.0.1(即本地主机),端口号为5174,作为客户机连接。
Client=tcpip('127.0.0.1',5174,'NetworkRole','client');
%% 建立连接,建立完成后进行下一步,否则报错
fopen(Client);%与一个服务器建立连接,直到建立完成返回,否则报错。
sprintf("成功建立连接")
%% 发送字符串,pause(1)要不要都可以
textSend="hello,world";
pause(1);
fprintf(Client,textSend);
%% 接收字符串,pause(1)要不要都可以,temp是最终结果
pause(1);
recv=char(fread(Client,Client.BytesAvailable,"char"));
temp="";
for i=1:(length(recv)-1)
    temp=temp+recv(i);
end
temp
%% 关闭客户端
fclose(Client);

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

注释一般都看得懂,比较难以理解的是这句代码:

recv=char(fread(Client,Client.BytesAvailable,"char"));

 
  • 1

我们首先使用:

fread(Client,Client.BytesAvailable,"char")

 
  • 1

读取收到的字节数据,我们读取的是char类型,理论上应该直接收到“hello world”,但是实际上获得是每个字符的ASCII码,是这样的:
在这里插入图片描述
查找ACSII码表就会发现,对应的确实是“hello,world”字串。我们通过char()强制类型转换,将其转化为字符,即可得到:
在这里插入图片描述
这样就得到了我们需要的字符。最后一段程序是为了对字符进行排序,意义不大,也很好理解。

3. 运行结果

首先运行C++服务器端,然后运行MATLAB客户端,得到下面的运行结果
C++端结果:
在这里插入图片描述
MATLAB端结果:
在这里插入图片描述
可以看到,达到了预期的结果

4. 大家有问题的话,随时交流!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值