TCP/IP开发实例(C++与LabVIEW的TCP通信 多线程)

您所在的位置:网站首页 labview缓冲区溢出怎么解决 TCP/IP开发实例(C++与LabVIEW的TCP通信 多线程)

TCP/IP开发实例(C++与LabVIEW的TCP通信 多线程)

2023-06-25 14:10| 来源: 网络整理| 查看: 265

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”下如下图红色框所在位置(千万不要写错位置,也不要写在其他行,否则亲测也会报错) 在这里插入图片描述

三、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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3