程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> vector(可變數組) 用於UDP通信

vector(可變數組) 用於UDP通信

編輯:C++入門知識

頭文件:

#include<vector.h>

然後,聲明並初始化vctor數組。

vector<char>  str(len);

其中len可以是變量或者常量。(其實用常量就沒有什麼意義了)。而且此vector容器已經將str 初始化過了。我們完全沒必要自己在memset(&str[0],0,str.size()).

注:

vector的內存是連續的,可以用memcpy,保證夠長就行。
vector<char> data(1024);
char buf[1024];
memcpy((char*)&data[0], buf, data.size());

其中,為什麼一定要這麼寫(char*)&data[0] 才能用memcpy呢?

1、因為memcpy要求參數是void *類型。在void *出來以前,都是用char *代替的,所以編譯器默認了char *到void *的轉換。用void *也是一樣的。

2、(char*)是memcpy的要求,&data[0]是取第一個元素的地址,vector不同於數組,不能用名字代替首地址。

      我之前用的&data老是錯,我覺得是指向了地址而非第一個元素的地址。而且,data.size(),與用sizeof(data),功能一樣。

一定要知道&data[0]才是vector容器裡面第一個元素的首地址。

下面是利用可變數組用於UDP通信的客戶端程序:(數據我還沒有做反序列化)

   1:  #include <Winsock2.h>
   2:  #pragma comment(lib,"WS2_32.lib")
   3:  #include <stdio.h>
   4:  #include<iostream>
   5:  #include <string> 
   6:  #include<vector>
   7:  using namespace std;
   8:  //服務器端口號為5050
   9:  #define DEFAULT_PORT 5050
  10:  //緩沖區長度
  11:  #define DATA_BUFFER 1024
  12:   
  13:  typedef unsigned short int uint;
  14:  typedef unsigned char uchar;
  15:   
  16:  typedef struct Point
  17:  {
  18:      uint x;
  19:      uint y;
  20:      uchar value;
  21:      uchar U;
  22:  } Point;
  23:  typedef struct Matrix
  24:  {
  25:      int Num;
  26:      Point point[100];
  27:   
  28:  } Matrix;
  29:   
  30:   
  31:  void main(int argc,char *argv[])
  32:  {
  33:  //    string str;
  34:      Matrix matrix;
  35:      
  36:      
  37:      //matrix.point = new Point[2];
  38:      memset(&matrix,0,sizeof(matrix));
  39:      matrix.Num = 2;
  40:      matrix.point[0].x = 1;
  41:      matrix.point[0].y = 1;
  42:      matrix.point[0].value = 1;
  43:      matrix.point[0].U = 1;    
  44:      matrix.point[1].x = 2;
  45:      matrix.point[1].y = 2;
  46:      matrix.point[1].value = 2;
  47:      matrix.point[1].U = 2;
  48:      int n = 2;
  49:      int len = n*sizeof(Point)+4;
  50:      vector<char> str(len);//聲明變長數組                 這裡的長度可以為len
  51:      //char* str = new char[n];
  52:      //memset(&str,0,sizeof(str));//將str,賦值0,長度為sizeof      ,已經初始化,不需要重復初始化str。
  53:      memcpy((char*)&str[0],(char*)&matrix,str.size());//將matrix裡面的值,賦值給str,長度sizeof。與上面剛好相反。
//這裡不可以用 len,而必須用str.size,他比len要多2個變量,4個字節。切記。
  54:   
  55:      //char *buffer=(char *)&matrix;
  56:      
  57:      WSADATA wsaData;
  58:      SOCKET sClient;
  59:      int iPort=5050;
  60:      //服務器地址長度
  61:      int iLen;
  62:      //接收數據的緩沖
  63:      int iSend;
  64:      int    iRecv;
  65:      //要發送給服務器的信息
  66:      char send_buf[]="I am a client.";
  67:      //接收數據的緩沖區
  68:      char recv_buf[DATA_BUFFER];
  69:      //服務器端地址
  70:      struct sockaddr_in ser;
  71:      //處理命令行中
  72:      //接收數據的緩沖區初始化
  73:      memset(recv_buf,0,sizeof(recv_buf));
  74:      if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
  75:      {
  76:          printf("Failed to load Winsock.\n");
  77:          return;
  78:      }
  79:      /*char map[10][20];
  80:      for(int i = 0;i < 10;i++)
  81:          for(int j = 0;j < 20;j++)
  82:             map[i][j] = 1;
  83:  
  84:      map[0][0] = 0;
  85:      map[0][1] = 0;
  86:      map[0][2] = 0;*/
  87:      //map[0][1] = 0;
  88:      //for(int i = 0;i < 10;i++)
  89:      //    for(int j = 0;j < 20;j++)    
  90:      //         sendData.obs[i][j] = map[i][j];
  91:   
  92:      //建立服務器端地址
  93:      ser.sin_family=AF_INET;
  94:      ser.sin_port=htons(iPort);
  95:      ser.sin_addr.s_addr=inet_addr("127.0.0.1");
  96:      //建立客戶端數據報套接口
  97:      sClient=socket(AF_INET,SOCK_DGRAM,0);
  98:      long k=0;
  99:      while (1)
 100:      {
 101:          if(sClient==INVALID_SOCKET)
 102:          {
 103:              printf("socket()Failed:%d\n",WSAGetLastError());
 104:              return;
 105:          } 
 106:          iLen=sizeof(ser);
 107:          //向服務器發送數據 
 108:          Sleep(5);//暫停一秒
 109:          //iSend=sendto(sClient,send_buf,sizeof(send_buf),0,(struct sockaddr*)&ser,iLen);
 110:          iSend=sendto(sClient,(char*)&str[0],len,0,(struct sockaddr*)&ser,iLen);//還有一個小問題,請大家注意:這裡不可用sizeof(str)來標識長度,會將str
 111:          k=k+1;                                                                   本身的size與容器大小給傳遞給目的端口。這兩個變量是我們不關心的。不需要這兩個值。
 112:          if(iSend==SOCKET_ERROR)
 113:          {
 114:              printf("sendto()Failed:%d\n",WSAGetLastError());
 115:              return;
 116:          }
 117:          else if(iSend==0)
 118:              return;
 119:          else
 120:              printf("sendto()succeeded. have sent %d times \n",k);
 121:   
 122:          //從服務器接收數據
 123:          //iRecv=recvfrom(sClient,recv_buf,sizeof(recv_buf),0,(struct sockaddr*)&ser,&iLen);
 124:          //if(iRecv==SOCKET_ERROR)
 125:          //{
 126:          //    printf("recvfrom()Failed.:%d\n",WSAGetLastError());
 127:          //    return;
 128:          //}
 129:          //else if(iRecv==0)
 130:          //    return;
 131:          //else
 132:          //{
 133:          //    //顯示從服務器收到的信息
 134:          //    printf("recvfrom():%s\n",recv_buf);
 135:          //    printf("---------------------------\n");
 136:          //}
 137:          
 138:      }
 139:      closesocket(sClient);
 140:      WSACleanup();
 141:  }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved