- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我必须集成 LabVIEW 和 C++ 代码,这些代码最终将在 FRC 机器人的板外处理器上运行。
我几个月前才开始用 C++ 编程,所以我对用 C++ 做任何太复杂的事情没有什么经验。
我决定通过 UDP 通信集成 LabVIEW 和 C++(我选择 UDP 而不是 TCP,因为我尝试了 TCP,但它对我的目的产生了太多延迟)。我编写了我的程序 C++ 客户端 UDP 程序,但是当谈到在 LabVIEW 中编写我的 UDP 程序时,我感到困惑。
在 C++ 中,客户端和服务器 UDP 程序之间似乎有明显的区别。在 C++ 中,客户端似乎尝试连接到服务器并且服务器响应。然而,在LabVIEW中,服务器似乎是由谁先发送来决定的。
下面是我的 C++ 代码以及我尝试使用 LabVIEW 程序但失败的图片。感谢您提供的任何帮助(如果您能告诉我如何使用 dll 执行此操作,这将非常有帮助,因为我找不到任何好的帮助)。
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <iostream>
#include <Windows.h>
#pragma comment(lib, "Ws2_32.lib")
using namespace std;
#define Input_PORT "0914"
#define Output_PORT "152120"
#define General_PORT "444"
int main(int argc, char* argv[]) {
WSADATA wsaData; //data for winsock
int iResult; //result of intelizing winsock
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
printf("WSA Intelized: %d\n", iResult);
system("pause");
//Creating Socket
struct addrinfo *result = NULL, *ptr = NULL, hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
// Resolve the server address and port
iResult = getaddrinfo(argv[1], General_PORT, &hints, &result);
if (iResult != 0) {
printf("getaddrinfo failed: %d\n", iResult);
WSACleanup();
return 1;
}
SOCKET ConnectSocket = INVALID_SOCKET; //Create Connecting Socket
// Attempt to connect to the first address returned by
// the call to getaddrinfo
ptr = result;
// Create a SOCKET for connecting to server
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
if (ConnectSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError());
freeaddrinfo(result);
WSACleanup();
return 1;
}
printf("Socket Created\n");
system("pause");
// Connect to server.
iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
if (iResult == SOCKET_ERROR) {
closesocket(ConnectSocket);
ConnectSocket = INVALID_SOCKET;
}
// Should really try the next address returned by getaddrinfo
// if the connect call failed
// But for this simple example we just free the resources
// returned by getaddrinfo and print an error message
freeaddrinfo(result);
if (ConnectSocket == INVALID_SOCKET) {
printf("Unable to connect to server!\n");
WSACleanup();
return 1;
}
printf("Connected\n");
system("pause");
return 0;
}
最佳答案
一般的UDP协议(protocol)是没有“连接”的,是无连接的。一个数据包被发送到一个 IP 地址和一个端口,并且没有监督是否收到该数据包。
双方都可以监听一个 UDP 端口,也可以将数据发送到网络中的另一个 UDP 端口/IP 地址。如果您调用一侧服务器(因为它正在响应命令)或客户端(因为它正在发送命令并且正在等待对它的响应)只是由您的应用程序定义。
安UDP packet包含“目标端口号”和“源端口号”。接收方监听特定端口(对于发送方而言是“目标端口”),发送方将数据发送到该端口。接收方通过发送方的“源端口号”获取另一方正在监听它想要发回内容的情况的信息。
我发现那里有一些关于“winsock 中的 UDP 套接字编程”的有用信息,我将其用于我的测试程序(我现在无法根据我的声誉状态发布更多链接,所以请自行添加 http://):www.binarytides.com/udp-socket-programming-in-winsock
#include "stdafx.h"
#include<stdio.h>
#include<winsock2.h>
#include <Ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib") // Winsock Library
#define REMOTE_SERVER_NAME "127.0.0.1" // IP address of udp remote server
#define REMOTE_SERVER_PORT 61557 // UDP port of the remote server which is listening
#define LOCAL_RCV_BUF_LEN 20 // max. length of receiving buffer
#define LOCAL_CMD_MSG_LEN 10 // max. length of command to send
int main(void)
{
struct sockaddr_in sockaddr_in1; // the SOCKADDR_IN structure specifies a transport address and port for the AF_INET address family.
int socket1; // descriptor referencing the socket
int sockaddr_in1_len = sizeof(sockaddr_in1);
char cmd_message[LOCAL_CMD_MSG_LEN]; // command message, read from input keys, send to the UDP server
char rcv_buf[LOCAL_RCV_BUF_LEN]; // receive buffer to store received data
WSADATA wsdata1; // contains information about the Windows Sockets implementation
// initialise winsock
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2, 2), &wsdata1) != 0)
{
printf("Failed. Error Code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
printf("Initialised.\n");
// create socket
if ((socket1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
{
printf("socket() failed with error code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
// setup address structure
memset((char *)&sockaddr_in1, 0, sizeof(sockaddr_in1));
sockaddr_in1.sin_family = AF_INET;
sockaddr_in1.sin_port = htons(REMOTE_SERVER_PORT);
inet_pton(AF_INET, REMOTE_SERVER_NAME, &sockaddr_in1.sin_addr.S_un.S_addr);
// start communication
while (1)
{
printf("Enter command (d=date, t=time) : ");
gets_s(cmd_message, sizeof(cmd_message) - 1);
// send the message
if (sendto(socket1, cmd_message, strlen(cmd_message), 0, (struct sockaddr *) &sockaddr_in1, sizeof(sockaddr_in1)) == SOCKET_ERROR)
{
printf("sendto() failed with error code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
// receive a reply and print it
memset(rcv_buf, '\0', sizeof(rcv_buf)); // clear the buffer by filling null, it might have previously received data
// try to receive some data, this is a blocking call
if (recvfrom(socket1, rcv_buf, sizeof(rcv_buf), 0, (struct sockaddr *) &sockaddr_in1, &sockaddr_in1_len) == SOCKET_ERROR)
{
printf("recvfrom() failed with error code : %d", WSAGetLastError());
exit(EXIT_FAILURE);
}
puts(rcv_buf);
}
closesocket(socket1);
WSACleanup();
return 0;
}
LabVIEW 有四个在此上下文中很重要的函数:
如果需要,您可以从以下目的地下载我的测试源(与上述链接相同):dl.dropboxusercontent.com/u/16833149/Simple%20UDP%20-%20Command%20Receiver.7z
关于c++ - 使用 UDP LabVIEW 与 UDP c++ 套接字通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42104527/
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我正在尝试在 LabVIEW 中创建一个简单的项目,我正在尝试使用滑动开关使 LED 闪烁 但是当我在后端(框图)连接滑动开关和 LED 并尝试运行我的 VI 时,当我按下“运行一次”按钮时我无法看到
我有一个 Labview 项目,其中包含多个类和与每个类关联的几个 VI。 项目和所有相关文件都包含在一个目录中。 当我复制(甚至重命名!)项目目录时,我可以加载它,但 Labview 警告我存在几个
我有一个数字控件(不是指示器)和一个 for 循环(限制 5) 我需要在数控中显示[当前循环索引+数控中的值]。我是 LabVIEW 新手。有什么想法可以做到这一点吗? 最佳答案 要将值写入控件,您需
为什么 LabVIEW允许在数字控制中使用字符(按下按键)吗? 当我按回车时,它会清除所有字符并返回到0。 我的问题是:为什么它只允许特定字符(而不是全部)? 最佳答案 这样做是为了方便用户。 因此,
我正在编写一个程序来控制 Labview 中的两个类似设备。为了避免复制代码,我使用了子 VI。但是我有一段代码,我在一个 while 循环内更新了 GUI 上的一些值。我想知道是否有可能以某种方式在
有没有办法链接 LabVIEW 前面板上的两个指示器,使它们始终具有相同的值?现在我每次都将两者设置为相同的值,但如果有一种方法可以设置一个来镜像另一个,那就容易多了。 最佳答案 您可以使数字显示可见
我有一个继承的 LabVIEW 应用程序,它有很多子 VI。在清理过程中我发现一些包含的 VI 没有被使用。我知道我可以使用 VI 层次结构来查看作为图标包含的每个 VI,但这对于与目录列表进行比较并
我创建了一个小型 LabVIEW VI,它提示输入一些数据库连接详细信息,然后返回一个 .net 对象,该对象具有访问存储在数据库中的数据的方法。到目前为止效果很好。但现在我想将其用作子 VI,因此我
在我看来,LabView 和 Microsoft Robotics Studio 具有非常相似的编程范例和环境。 比较这两种产品是否公平,或者它们处于不同的级别? 我希望使用过这两种产品的人可以帮助比
我有一个 LabView 数据采集系统,它将数据写入 MySQL 数据库。它每秒都在写入数据。最近,当我玩 SQL 查询时,LabView 系统死机了。 我有一台客户端计算机,它应该每小时向该 MyS
我绝不被视为程序员。我知道的唯一编程语言是 HTML - 所以要温柔 :) 前几天我的老板来找我,问我是否想学习 PHP,所以我说当然。他扔给我一些教科书,然后说这是我要你做的: 有一台运行 labv
我正在尝试打开 .exe 以从 LabVIEW 对 PLC 进行编程。我将 .exe 包含在项目文件中,它也作为源文件包含在内,因此在安装此工具时它会安装在安装目录中。问题是有时在打开时(以及在关闭时
我和我的团队是 Kollmorgen AKD Basic 电机驱动的新手,并且是第一次使用 LabVIEW 的 TCP/IP 协议(protocol)接口(interface)来使用该驱动器。 我们可
我有一个包含LabView程序的文件,需要了解它的作用。当然,没有LabView也无法执行。但是,没有Labview的情况下可以阅读LabView程序吗? 最佳答案 我所做的解析器可以读取VI,并将大
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .
我有两个 bool 元素或开关。 当我打开第一个时,第二个应该关闭,反之亦然。 所以,我试图让元素既是指标又是控件。 我读到我必须打开可见项目子菜单下的数字显示器,但没有这样的选项。 你能帮我解决这个
我已经为锁定系统编写了 LabView 代码。 这把锁有一个运动计时器,它依赖于数字控件的输入。我添加了一个脚本文件阅读器,需要能够更改该计时器值。使用选择器,我可以在值之间切换,但我希望它更新控件中
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一名优秀的程序员,十分优秀!