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

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

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

1. C++程序:服务器端

#include 
#include 
#include 
#include 
#pragma comment(lib,"Ws2_32.lib")
#include 

#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 > 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,
			&ThreadProcServerConmunicate,
			psc,
			0,
			NULL
		);
	}
	// 关闭套接口和服务
	int is = closesocket(s);
	WSACleanup();
	return 0;
}

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

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);

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

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

我们首先使用:

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

读取收到的字节数据,我们读取的是char类型,理论上应该直接收到“hello world”,但是实际上获得是每个字符的ASCII码,是这样的:
MATLAB和C++程序使用TCP/IP协议进行通信_第1张图片
查找ACSII码表就会发现,对应的确实是“hello,world”字串。我们通过char()强制类型转换,将其转化为字符,即可得到:
MATLAB和C++程序使用TCP/IP协议进行通信_第2张图片
这样就得到了我们需要的字符。最后一段程序是为了对字符进行排序,意义不大,也很好理解。

3. 运行结果

首先运行C++服务器端,然后运行MATLAB客户端,得到下面的运行结果
C++端结果:
MATLAB和C++程序使用TCP/IP协议进行通信_第3张图片
MATLAB端结果:
MATLAB和C++程序使用TCP/IP协议进行通信_第4张图片
可以看到,达到了预期的结果

4. 大家有问题的话,随时交流!

你可能感兴趣的:(MATLAB代码,c++,socket,matlab,tcpip)