在一些时候,需要我们一边调试matlab代码,一边观察算法输出结果对c++代码的影响,因此需要建立二者之间的通信。本次采用的方法时TCP通信的方式,因为matlab里有内置的tcp相关库,使用起来较为方便。
我希望c++端先发送数据,再接收matlab解算过后的数据,因此将c++端设置为客户端,matlab设置为服务器。
c++端代码:
#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable:4996)
#define DEFAULT_PORT 12345
#define DEFAULT_BUFLEN sizeof(double)
int main() {
WSADATA wsaData;
SOCKET clientSocket = INVALID_SOCKET;
struct sockaddr_in serverAddress;
double sendData[5] = { 3.14,3,2,1.46,0.78 };
double receivedData;
uint8_t buffer_send[40];
uint8_t buffer_rec[40];
double recData[5];
// 初始化Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cout << "Failed to initialize Winsock." << std::endl;
return 1;
}
// 创建套接字
clientSocket = socket(AF_INET, SOCK_STREAM, 0);
if (clientSocket == INVALID_SOCKET) {
std::cout << "Failed to create socket." << std::endl;
WSACleanup();
return 1;
}
// 设置服务器地址
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(DEFAULT_PORT);
serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
// 连接到服务器
if (connect(clientSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR) {
std::cout << "Failed to connect to server." << std::endl;
closesocket(clientSocket);
WSACleanup();
return 1;
}
int index = 0;
while (1) {
// 发送数据
memcpy(buffer_send, sendData, sizeof(sendData[0]) * 5);
send(clientSocket, (char*)buffer_send, sizeof(buffer_send), 0);
std::cout << "Sent data: " << sendData[0] << "\t"
<< sendData[1] << "\t"
<< sendData[2] << "\t"
<< sendData[3] << "\t"
<< sendData[4] << "\t" << std::endl;
// 接收数据
recv(clientSocket, (char*)buffer_rec, sizeof(buffer_rec), 0);
memcpy(recData, buffer_rec, sizeof(recData[0]) * 5);
std::cout << "Received data: " << recData[0] << "\t"
<< recData[1] << "\t"
<< recData[2] << "\t"
<< recData[3] << "\t"
<< recData[4] << "\t" << std::endl;
index++;
if (index == 10)break;
}
// 关闭套接字
closesocket(clientSocket);
WSACleanup();
return 0;
}
matlab端代码:
% 创建TCP服务器
t = tcpip('0.0.0.0', 12345, 'NetworkRole', 'server');
% t.InputBufferSize = 40; % double类型数据的字节数
% 打开服务器
fopen(t);
disp('Waiting for connection...');
index=0;
while 1
% 等待数据到达
while t.BytesAvailable == 0
pause(0.001);
end
% 接收数据
data = fread(t, t.BytesAvailable, 'uint8');
receivedData = typecast(uint8(data), 'double');
receivedData = receivedData(:)';
disp(['Received data: ', num2str(receivedData)]);
% 处理数据(这里只是简单示例)
processedData = receivedData * 2;
% 发送数据
sendData = typecast(processedData, 'uint8');
fwrite(t, sendData, 'uint8');
disp(['Sent data: ', num2str(processedData)]);
index = index+1;
if index==10
break;
end
end
% 关闭服务器
fclose(t);
delete(t);
实验结果如下:
从实验结果可以看出,两边成功通信了10次。