頭文件:
#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: }