• C++与C# UDP通信实例(同一台PC)


     

    对于同一个PC机而言,服务器端和客户端在一个PC机上面,端口必须要不一样,不然会冲突。

    你总不能自己又当爹又当妈吧。

    所以在进行程序设计的时候,需要考虑这一点:

    在此接口设计中,C++当作UDP的服务器端

    程序设计如下:

    1. WSADATA wsaData = {0};
    2.       SOCKET socksvr;
    3.       int iPort=7900;
    4.        //服务器地址长度
    5.       int iLen = 0;
    6.        //接收数据的缓冲
    7.        int iSend = 0;
    8.       int iRecv = 0;
    9.  
    10.        if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
    11.       {
    12.           printf("Failed to load Winsock. ");
    13.           return 0;
    14.       }
    15.        struct sockaddr_in ser;
    16.        ser.sin_family=AF_INET;
    17.        ser.sin_port=htons(8299);
    18.        ser.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    19.       //建立服务端数据报套接口
    20.        socksvr=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    21.       //udp绑定
    22.       bind(socksvr,(struct sockaddr*)&ser,sizeof(ser));
    23.  
    24.       //客户端信息地址,这里是点对点通信,需要加上IP+port。
    25.       //对于UDP来说,可以不用IP,因为它是无连接的。只要在一个网段就行。
    26.       //也就是说,无论是TCP还是UDP,都可以指定向某个电脑的端口发送数据。
    27.       //只需要在客户端监听此端口就行。对于TCP:connect,对于UDP:listen
    28.       struct sockaddr_in clientaddr = {0};
    29.       clientaddr.sin_family=AF_INET;
    30.       clientaddr.sin_port=htons(8300);//7901
    31.       clientaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    32.       int nLen = sizeof(clientaddr);
    33.  
    34.       Sleep(10);
    35.  
    36.       string cam_dir = "C:\CameraData";
    37.       mkdir(cam_dir.c_str());
    38.       while(1)
    39.       {
    40.          matrix.Num = 0;
    41.          matrix_vehicle.Num = 0;
    42.          if (0)//imgs_lane.isNew || imgs_pedestrain.isNew || imgs_vehicle.isNew
    43.          {
    44.             matrix = imgs_lane.Get();
    45.             pe = imgs_pedestrain.Get();
    46.             matrix_vehicle = imgs_vehicle.Get();
    47.  
    48.             //行人有宽度信息,所以需要增加的不止一个点
    49.  
    50.             matrix.point[matrix.Num++] = pe;//增加行人,若没有,其标志位为0
    51.  
    52.             if (matrix_vehicle.Num > 1) //增加车辆,若没有,其标志位为0
    53.             {
    54.                for (int i = 0; i < matrix_vehicle.Num; ++i)
    55.                {
    56.                   matrix.point[matrix.Num++] = matrix_vehicle.point[i];
    57.                }
    58.             }
    59.  
    60.             if(matrix.Num > 0)
    61.             {
    62.                int ret = sendzmq->PubMsg("Camera_Data",matrix);
    63.                //int len = matrix.Num*sizeof(Point) + 4;
    64.                //sendudp->udpSendToCanet((unsigned char*)&matrix,len);
    65.                //cout << "ret num: " << ret << endl;
    66.             }
    67.  
    68.  
    69.          }
    70.  
    71.          IplImage* demo = imgs_gray.Get();
    72.  
    73.  
    74.          //存储图片
    75.          //数据独立存储
    76.          char szFileName[_MAX_PATH] = {0};
    77.          SYSTEMTIME sys;
    78.          GetLocalTime(&sys);
    79.          long cntTime = sys.wHour*60*60*1000 + sys.wMinute*60*1000 +
    80.             sys.wSecond*1000 + sys.wMilliseconds;
    81.          sprintf(szFileName, "%ld",cntTime);
    82.  
    83.          string dir = cam_dir + "\";
    84.          string tenp = "";
    85.          tenp = szFileName;
    86.          tenp += ".jpg";
    87.          dir += tenp;
    88.          //cvSaveImage 第三个参数可以设置压缩的质量
    89.          int params[3];
    90.          params[0] = CV_IMWRITE_JPEG_QUALITY;
    91.          params[1] = 85;
    92.          params[2] = 0;
    93.          cvSaveImage(dir.c_str(),demo,params);
    94.          Sleep(1);
    95.  
    96.          iSend=sendto(socksvr,dir.c_str(),dir.size(),0,(struct sockaddr*)&clientaddr,nLen);
    97.  
    98.          cout << "ret: " << iSend << endl;
    99.  
    100.          Sleep(100);
    101.       }
    102.          return 0;
    103.    }

    用此保存后在读取图片的方式可以将300多K的数据压缩至20K。大大减少数据量,基本上是20倍。

     

    对于C#端,我们只需要接收固定端口的数据即可:

    程序代码设计如下:

    1. private const int listenPort = 8300;
    2.  
    3.      static void Main(string[] args)
    4.      {
    5.          UdpClient listener = new UdpClient(listenPort); //本机侦听的端口号实例化
    6.          IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort); //实例化
    7.  
    8.          while (true)
    9.          {
    10.              byte[] bytes = listener.Receive(ref groupEP);
    11.  
    12.              string str = System.Text.Encoding.Default.GetString(bytes);
    13.          }
    14.       }

     

    基本设计完毕。

    实现的功能:从C++当中将图片的存储路径发到C#端。

  • 相关阅读:
    Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件
    RESTful风格、异常处理、Spring框架
    文件上传、数据校验(后台)、拦截器
    接收的参数为日期类型、controller控制层进行数据保存、进行重定向跳转
    SpringMVC入门Demo
    Mybatis入门Demo(单表的增删改查)
    Spring
    spring的exception
    restful风格
    Java后台验证
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/6036996.html
Copyright © 2020-2023  润新知