Chinaunix首页 | 论坛 | 博客
  • 博客访问: 32513
  • 博文数量: 9
  • 博客积分: 370
  • 博客等级: 一等列兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-31 14:48
文章分类

全部博文(9)

文章存档

2011年(9)

我的朋友

分类: LINUX

2011-01-05 15:52:26

   在网络传输中,我们传输的数据往往是不定长的。比如说我们用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) |
给主人留下些什么吧!~~

chinaunix网友2011-01-06 15:04:57

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com