对于同一个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.\n");
  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#端。

C++与C# UDP通信实例(同一台PC)的更多相关文章

  1. VC++使用socket进行TCP、UDP通信实例总结

    1.        两台计算机通信需要协议,通信的两台计算机IP必须唯一 2.        同一个计算机可以进行多个应用程序与其他计算机通信,IP地址唯一,而端口号是区别同一计算机(同一IP)的唯一 ...

  2. 套接字、UDP通信、TCP通信、TCP/IP协议簇

    一.套接字(socket) 1.英语单词socket:n.插座:穴:v.插入插座 2.套接字就是源IP地址和目的IP地址.源端口号和目的端口号的组合,是通过传输层进行通信的.IP指定电脑,端口指定某一 ...

  3. 【.NET类库】通过SharpSocket进行TCP/UDP通信数据传输

    类库作用: 用于基于TCP/UDP协议的数据通信,调用简单,高效. 封装了和业务无关的底层细节,让开发人员可以专注于做业务 完善的示例代码: 针对类库的几种用法,都提供了较为详细的示例代码 一.TCP ...

  4. [C语言]一个很实用的服务端和客户端进行UDP通信的实例

    前段时间发了个TCP通信的例子,现在再来一个UDP通信的例子.这些可以作为样本程序,用到开发中.“裸写”socket老是记不住步骤,经常被鄙视…… 下面的例子很简单,写一个UDP的server用于收包 ...

  5. Linux下简单的socket通信实例

    Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...

  6. C#之UDP通信

    简介 C#中的udp通信关键类:Udpclient,它位于命名空间System.Net.Sockets中,发送接收都是UdpClient类, 命名空间 using System.Net.Sockets ...

  7. 等待唤醒机制,UDP通信和TCP通信

    等待唤醒机制 通过等待唤醒机制使各个线程能有效的利用资源. 等待唤醒机制所涉及到的方法: wait() :等待,将正在执行的线程释放其执行资格 和 执行权,并存储到线程池中. notify():唤醒, ...

  8. 微信小程序UDP通信

    前言 UDP通信分为单播 广播 组播,基础库2.7.0之后,小程序开始支持UDP通信,目前小程序只支持单播. 小程序API 小程序UDP通信这一块可以说是很简单了就一个UDPSocket实例.然后bi ...

  9. 网络通信协议、UDP通信、TCP通信

    网络通信协议 网络通信协议有很多种,目前应用最广泛的是TCP/IP协议,它是一个包括TCP协议和IP协议,UDP协议和其它一些协议的协议组. IP地址和端口号 目前,IP地址广泛使用的版本是IPv4, ...

随机推荐

  1. 【工业串口和网络软件通讯平台(SuperIO)教程】六.二次开发导出数据驱动

    SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    导出数据接口的作用 在数据集成系统项目中,要么是自已集成其他厂家的设备,要么是其他厂家集成自己 ...

  2. 浅入浅出dubbo

    1. Dubbo是什么? 只是一个框架 Hibernate是持久层框架,SpringMVC是MVC的框架,而Dubbo是分布式服务框架. 是框架而不是服务 所以不是像Tomcat或Memcached可 ...

  3. 【特别推荐】小伙伴们惊呆了!8个超炫的 Web 效果

    CodePen 是一个在线的 HTML.CSS 和 JavaScript 代码编辑器,能够编写代码并即时预览效果.你在上面可以在线展示自己的作品,也可以看到其他人在网页中实现的各种令人惊奇的效果. 今 ...

  4. 在vs2012中用C#开发Android应用Xamarin环境搭建

    Xamarin是Mono创始人Miguel de Icaza创建的公司,旨在让开发者可以用C#编写iOS, Android, Mac应用程序,也就是跨平台移动开发. 简介 Xamarin是基于Mono ...

  5. 关于ArcGIS API for JavaScript中basemap的总结介绍(一)

    实际上basemap这个概念并不只在arcgis中才有,在Python中有一个matplotlib basemap toolkit(https://pypi.python.org/pypi/basem ...

  6. Golang(笔记) 顺序编程

    package main import ( "fmt" "bufio" "io" "os" "strconv& ...

  7. android中的线程池学习笔记

    阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...

  8. 我们为什么要使用maven,公司推行maven杂谈

    最近在公司内推荐使用maven,推荐一个落后于业内十年的技术,实在没什么好说的,可是没想到遇到了前所未有的阻力,总是听到各种各样的质疑,我就闹不明白了,推行这个东西是为了更规范的管理项目成果,方便大家 ...

  9. mac系统及xcode使用的SVN客户端安装升级

    当前的SVN版本已经升级到1.8.x了,但mac系统自带的以及xcode使用的SVN客户端版本没有跟着升级,还是1.6.x的版本.为了解决隐藏目录.svn只在根目录下存在的情况,至少要升级到1.7.x ...

  10. Oracle创建表空间和用户

    用户名为:C##NEWO ============================================================================= /*分为四步 */ ...