头文件:

#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.\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本身的size与容器大小给传递给目的端口。这两个变量是我们不关心的。不需要这两个值。
 111:          k=k+1;                                                                   
 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:  }

vector(可变数组) 用于UDP通信的更多相关文章

  1. [STL] vector 可变数组

    点击查看代码 #include<iostream> #include<vector> using namespace std; int main() { // 初始化 a 为 ...

  2. 【RL-TCPnet网络教程】第17章 RL-TCPnet之UDP通信

    第17章      RL-TCPnet之UDP通信 本章节为大家讲解RL-TCPnet的UDP通信实现,学习本章节前,务必要优先学习第16章UDP用户数据报协议基础知识.有了这些基础知识之后,再搞本章 ...

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

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

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

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

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

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

  6. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.3

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  7. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.2

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  8. 高性能 TCP & UDP 通信框架 HP-Socket v3.5.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  9. 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

随机推荐

  1. 【bzoj1097】[POI2007]旅游景点atr 状压dp+堆优化Dijkstra

    题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个 ...

  2. 抄书 Richard P. Stanley Enumerative Combinatorics Chapter 2 Sieve Methods

    2.1 Inclusion-Exclusion Roughly speaking, a "sieve method" in enumerative combinatorics is ...

  3. VMWare VMNet 8 的配置使用

    网上有很多讲解VMWare网络原理的文章,我在这里就不在赘述,有兴趣的朋友可以自己搜 本章主要介绍下我们使用VM最常用的两种网络模式,VMNet 0 和 VMNet 8 本文均为原创,如需转载请标明, ...

  4. pat 甲级 1099. Build A Binary Search Tree (30)

    1099. Build A Binary Search Tree (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...

  5. linux之软硬链接【转】

    链接---------是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法. Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(S ...

  6. .net开发工具集合

    原文发布时间为:2010-10-24 -- 来源于本人的百度文章 [由搬家工具导入] 原文出处:.NET Tools:Ten Must-Have Tools Every Developer Shoul ...

  7. 当文字过长时裁剪(显示省略号或只裁剪 用CSS方法,不用程序)

    原文发布时间为:2009-09-16 -- 来源于本人的百度文章 [由搬家工具导入] CSS中ellipsis()应用【转】 CSS手册中text-overflow属性的定义:   语法: text- ...

  8. js禁用"Backspace"键(即禁止网页倒退)

    项目遇到的一个问题一个普通网页,如果这个网页上没有焦点的话,那么点击"Backspace"键的时候,网页会回退(倒退到上一个网页),这样就会就有一个问题,当我在一个输入框进行输入的 ...

  9. Java EE学习记录(一)

    话说大家都在说java EE,但是java EE的分层结构如下: 1.数据持久层:主要由一些负责操作POJO(Plain Old Java Object)的类构成,主要负责将数据保存进入数据库; 2. ...

  10. hdu3715 2-sat+二分

    Go Deeper 题意:确定一个0/1数组(size:n)使得满足最多的条件数.条件在数组a,b,c给出. 吐槽:哎,一水提,还搞了很久!关键是抽象出题目模型(如上的一句话).以后做二sat:有哪些 ...