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.\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#端。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM