C++ 调用c#的dll动态链接库,进行UDP通信数据处理

我需要将雷达的数据包通过UDP通信接回来,然后用c++调用c# 的dll库来实现雷达数据处理,

c++ udp通信网上资料很多,由于我是新手,完全不了解c++和c#,所以我的大部分时间都是在解决c++ 字符类型到c# 的类型转换。

通过这个试验学到了:

调用c# dll动态链接库时

1. 刚开始调用的时候看着网上的步骤来的,但是我的有时候会报  托管字符 这种错误。后来经过别人的指点了解到 CLI::

cli::array^ buffer = gcnew cli::array(1400);

2.学会创建array类型,长度为1400 的数组

cli::array^ buffer = gcnew cli::array(1400);

3.udp通信时接回来的数据都是char类型的

recvfrom(sockRec, recvBuf, 1400, 0, (SOCKADDR*)&addrSen, &len);

而c# 需要的是array类型

我通过查资料只找到了,循环赋值的这种方法,还需要查找有没有更好的办法。

        for (int i = 0; i < 1400; i++)
        {
            buffer[i] = recvBuf[i];
        } 

全程序

#include 
#include 
#include 
#include 
#pragma comment(lib,"WS2_32.lib")

# 把路径写全
#using "D:\vs\ConsoleApplication1xandll\fd_radar.dll"

using namespace fd_radar;
using namespace std;
using namespace System;


int main()
{
    # c#的需要用到的字符串
    string parms = "FD50 6000  ";

    # 转换了一下格式类型
    String^ managedString = gcnew String(parms.c_str());

    # 创建类型为array类型的 长度为1400 的数组
    cli::array^ buffer = gcnew cli::array(1400);

    # 把需要调用c#dll库里的函数实例化
    fd_radar::Trace^ trace = gcnew fd_radar::Trace("FD5",managedString );
    

    // UDP通信
    //创建套接字
    WORD wVersionRequested;
    WSADATA wsaData;
    wVersionRequested = MAKEWORD(1, 1);
    int err = WSAStartup(wVersionRequested, &wsaData);
    printf("Client is operating!\n\n");
    SOCKET sockRec = socket(AF_INET, SOCK_DGRAM, 0);
    //套接字绑定到一个本地地址和端口
    SOCKADDR_IN addrRec;
    addrRec.sin_addr.S_un.S_addr = htonl(INADDR_ANY); // ip地址
    addrRec.sin_family = AF_INET;
    addrRec.sin_port = htons(60000);//端口号
    bind(sockRec, (SOCKADDR*)&addrRec, sizeof(SOCKADDR));
    //调用recvfrom()向服务器发送指定数据
    SOCKADDR_IN addrSen;
    int len = sizeof(SOCKADDR);
    char recvBuf[1400];

    while (true)
    {
        # 接收数据包
        recvfrom(sockRec, recvBuf, 1400, 0, (SOCKADDR*)&addrSen, &len);
        printf("%s\n", recvBuf);

        // c++ char类型转为 c# array类型
        for (int i = 0; i < 1400; i++)
        {
            buffer[i] = recvBuf[i];
        }


        // 将转换后的字符串输入dll库里的函数  通过实例化的trace可以直接调用里面的函数
        trace->Input(buffer);

        # 
        fd_radar::Trace::TrackData^ trackdata = gcnew fd_radar::Trace::TrackData;
        //输出  查看函数里变量
        cout <<"方位 = " << trace->ServoAngle << endl;
        int amp = trackdata->Amp;
        int no = trackdata->No;
        float prange = trackdata->PRange;
        cout << "amp = " << amp << "   no = " << no << "   prange = " << prange << endl;
    }

}

你可能感兴趣的:(c++,c++,c#,udp,visual,studio)