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.\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通信的更多相关文章
- [STL] vector 可变数组
		点击查看代码 #include<iostream> #include<vector> using namespace std; int main() { // 初始化 a 为 ... 
- 【RL-TCPnet网络教程】第17章 RL-TCPnet之UDP通信
		第17章 RL-TCPnet之UDP通信 本章节为大家讲解RL-TCPnet的UDP通信实现,学习本章节前,务必要优先学习第16章UDP用户数据报协议基础知识.有了这些基础知识之后,再搞本章 ... 
- 等待唤醒机制,UDP通信和TCP通信
		等待唤醒机制 通过等待唤醒机制使各个线程能有效的利用资源. 等待唤醒机制所涉及到的方法: wait() :等待,将正在执行的线程释放其执行资格 和 执行权,并存储到线程池中. notify():唤醒, ... 
- 【.NET类库】通过SharpSocket进行TCP/UDP通信数据传输
		类库作用: 用于基于TCP/UDP协议的数据通信,调用简单,高效. 封装了和业务无关的底层细节,让开发人员可以专注于做业务 完善的示例代码: 针对类库的几种用法,都提供了较为详细的示例代码 一.TCP ... 
- 网络通信协议、UDP通信、TCP通信
		网络通信协议 网络通信协议有很多种,目前应用最广泛的是TCP/IP协议,它是一个包括TCP协议和IP协议,UDP协议和其它一些协议的协议组. IP地址和端口号 目前,IP地址广泛使用的版本是IPv4, ... 
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.3
		HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ... 
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.2
		HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ... 
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.1
		HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ... 
- 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1
		HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ... 
随机推荐
- POJ 3255:Roadblocks(次短路)
			题目大意:求无向图的次短路. 分析: 在起点终点各求一次最短路,枚举边,通过该边的最短路为其权值加上到起点和终点最短路之和,找到最短但又比最短路长的路径. 代码: program block; typ ... 
- HDU 4027 Can you answer these queries?(线段树区间开方)
			Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K ... 
- Master of Sequence
			Master of Sequence 时间限制: 10 Sec 内存限制: 128 MB 题目描述 There are two sequences a1,a2,...,an , b1,b2,..., ... 
- 团体天梯赛 L3-001. 凑零钱
			L3-001. 凑零钱 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现 ... 
- C++ 求幂的运算符是什么?
			1.VB里面求幂的运算符是“^” 2.C++没有求幂的运算符, c++头文件加 #include<math.h>使用pow(x,y),可算出x的y次幂 3.C++中 “^”是按位“异或”运 ... 
- android基本控件学习-----ScrollView
			ScrollView(滚动条)的讲解: 一.对于ScrollView滚动条还是很好理解的,共有两种水平和垂直,ScrollView和HorizontalScrollview,这个里面不知道该总结写什么 ... 
- hdu 3072 有向图缩点成最小树形图计算最小权
			题意,从0点出发,遍历所有点,遍历边时候要付出代价,在一个SCC中的边不要付费.求最小费用. 有向图缩点(无需建立新图,,n<=50000,建则超时),遍历边,若不在一个SCC中,用一个数组更新 ... 
- 网络请求失败记录(安卓4g网络下第一次请求特别慢或者失败)
			最近app的一次版本上线以后出现4g网络下请求接口特别慢,第一次调用接口非常非常慢或者直接访问失败,后面就正常了,但是WiFi情况下并不会出现这个问题.最主要的是IOS的线上app并没有问题. 开始怀 ... 
- (7)JavaScript-BOM(浏览器对象模 型)
			window 对象 全局作用域 在浏览器中, window 对象有双重角色,它既是通过 JavaScript 访问浏览器窗口的一个接口,又是 ECMAScript 规定的 Global 对象. 所有在 ... 
- codevs——3111 CYD啃骨头(背包)
			裸的01背包 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description CYD吃饭时有N个骨头可以啃,但CYD要午睡了 ... 
