TCP/IP开发实例(C++与LabVIEW的TCP通信 多线程)
一、本文目标:
将C++端作为Server,主要用于进行中心数据处理,而Labview作为用户端,主要进行指令的发送以及接受来自服务器的数据进行实时显示。这样做的好处有:
1.Labview对于流数据的梳理有着很多强大的封装好的API,可以进行调用,尤其是用于强度图(二维数组)的显示。
2.Labview是基于图形化变成,对于程序的控制灵活度没有使用代码编程的语言便捷,且C++有着强大的开源社区以及各种数据处理的头文件。
3.使用C++的多线程结构,进一步提高程序效率与灵活度。
二、写在前面:
本案例将使用C++的 WinSock2 进行TCP/IP,通信,且运行的编译环境为VSCode,在导入这个头文件后运行程序会报错,需要读者进行如下操作:打开task.json文件,将“-lws2_32”下如下图红色框所在位置(千万不要写错位置,也不要写在其他行,否则亲测也会报错) ![在这里插入图片描述](https://img-blog.csdnimg.cn/d779cf41e8ed42bf8f63b71bc94077cb.png)
三、C++代码(作为服务器端)
//code C++
#include
#include
#include
#include
#include
#include
using namespace std;
#pragma comment(lib,"WS2_32.lib")
//定义一些全局变量,便于所有函数调用
char recvBuffer[200] = ""; //接受指令的缓存区,大小根据实际需要开辟,这里为200
char sendBuffer[12500] = "";//发送数据的缓存区,大小根据实际需要开辟,这里为12500
sockaddr_in serverAddr;
sockaddr_in clientAddr;
SOCKET serverSock;
int client;
/*############################################################################
功能:与上位机建立建立TCP连接
############################################################################*/
void buildTcpServer(){
//初始化Socket
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
serverSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
serverAddr.sin_port = htons(9999);
//先绑定
if (bind(serverSock, (struct sockaddr *)&serverAddr, sizeof(serverAddr))
printf("127.0.0.1 listen fail!\n");
return;
}
}
/*############################################################################
功能:接受来自上位机的指令
############################################################################*/
void recvCommand()
{
while (true)
{
printf("Listening on port: %d\n", 9999);
//调用accept函数后,会进入阻塞状态
//accept返回一个套接字的文件描述符,这样服务器端便有两个套接字的文件描述符,
//serverSocket和client。
//serverSocket仍然继续在监听状态,client则负责接收和发送数据
//clientAddr是一个传出参数,accept返回时,传出客户端的地址和端口号
//addr_len是一个传入-传出参数,传入的是调用者提供的缓冲区的clientAddr的长度,以避免缓冲区溢出。
//accept阻塞执行,直到获取到有客户端连接
int clientAddrLen = sizeof(clientAddr);
client = accept(serverSock, (struct sockaddr*)&clientAddr, &clientAddrLen);
if (client
if (recv(client, recvBuffer, 200, 0) 0};
memset(recvBuffer,'\0',sizeof(recvBuffer));
}
}
}
//向上位机发送数据,这里我们一次性发送从0~124一共125个数字
void sendData(){
while(1){
for(int i=0;i |