在网络传输中,我们传输的数据往往是不定长的。比如说我们用QQ聊天,聊天的内容是不定长的,而事先申请一块足够大的内存,一是对内存空间的浪费,二是造成网络传输的过程中数据量增大。这个问题我们可以采用一种比较巧妙的方法解决。
我们这样定义数据结构
typedef struct tagTransferData
{
///一些其他信息////
datatype dataSize;
char buffer[1];//定义一个可变长度的数组
}Data,*PData;
下面是使用实例:
PData pData = (PData)malloc(strlen("good morning everyone!")+1+4);
memset(pData,0, strlen("good morning everyone!")+1+4);
..........
char sendData[]="good morning everyone!";
strcpy(pData->buffer,sendData);
pData->dataSizse = strlen(sendData)+1;
..........
ret = sendto(sfd, pData, sizeof(*pData), 0, NULL, NULL);
if (ret == -1) {
perror("sendto");
exit(1);
}
...........
...........
//传输的另一端
/* 这里运用“偷窥技术”,先得到结构体大小,然后根据大小再进行后面的malloc */
ret = recvfrom(sd, &peekbuf, sizeof(peekbuf),MSG_PEEK, NULL, NULL);
if (ret == -1) {
perror("recvfrom");
exit(1);
}
if (ret > 0) {
size = peekbuf.dataSize;
actualbuf = (PData) malloc(size);
if (actualbuf == NULL) {
perror("malloc");
exit(1);
}
}
ret = recvfrom(sd, actualbuf, size, 0, NULL, NULL);
...........
阅读(1461) | 评论(1) | 转发(1) |