zoukankan      html  css  js  c++  java
  • vector(可变数组) 用于UDP通信

    头文件:

    #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];    本来是准备用动态开辟字符数组这种方式的,但每次传递都只传递指针大小的变量。在udp进行sendto()时发生错误。
      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.
    ");
      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
    ",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本身的size与容器大小给传递给目的端口。这两个变量是我们不关心的。不需要这两个值。
     111:          k=k+1;                                                                   
     112:          if(iSend==SOCKET_ERROR)
     113:          {
     114:              printf("sendto()Failed:%d
    ",WSAGetLastError());
     115:              return;
     116:          }
     117:          else if(iSend==0)
     118:              return;
     119:          else
     120:              printf("sendto()succeeded. have sent %d times 
    ",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
    ",WSAGetLastError());
     127:          //    return;
     128:          //}
     129:          //else if(iRecv==0)
     130:          //    return;
     131:          //else
     132:          //{
     133:          //    //显示从服务器收到的信息
     134:          //    printf("recvfrom():%s
    ",recv_buf);
     135:          //    printf("---------------------------
    ");
     136:          //}
     137:          
     138:      }
     139:      closesocket(sClient);
     140:      WSACleanup();
     141:  }
  • 相关阅读:
    UVA 12467
    UVA 12604
    部署ASP.NET MVC项目
    以路由控制URL
    Week13(12月2日):又到了那个点,期末了~~~~
    购物网站讨论5:会员功能的实现
    购物网站讨论4:订单结账功能实现
    购物网站讨论3:购物车功能实现
    购物网站讨论2:商品浏览功能实现
    购物网站讨论1:关于模型那些事
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/3517228.html
Copyright © 2011-2022 走看看