LabVIEWとC++コードを統合する必要があり、最終的にはFRCロボットのオフボードプロセッサを使用します。UDP LabVIEWを使用してUDP C++ソケットと通信する
私は数ヶ月前にC++でプログラミングを始めただけなので、C++で複雑すぎることはほとんど経験していません。
私は、LabVIEWとC++をUDP通信で統合することに決めました(私はTCPを試したのでUDPを選択しました。私は自分のプログラム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;
}
あなたはTCPがあまりにも遅れを与えたと言います。 TCP_NODELAYを設定しましたか? –
SOCK_STREAMはTCPを指定するので、あなたが投稿したC++プログラムはUDPではなくTCPで通信していることに注意してください。 UDPをしたいのであれば、SOCK_DGRAMを指定する必要があります(connect()コマンドを取り除き、send()/ recv(); send()/ recvfrom ()はUDP通信にはあまり役に立ちません) –
-John Zwinch、TCP_NODELAYを試しました(私はあなたがLabVIEW VIについて話していると仮定しています) –