免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8520 | 回复: 17
打印 上一主题 下一主题

如何循环接受数据(recvfrom ) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-29 13:24 |只看该作者 |倒序浏览
udp客户端从服务器端接受数据,服务器端发送的数据大小不定

#define MAX 100

char recvdata[MAX]
while(1){
   int n;
   n=recvfrom(sockfd,recvdata,MAX,0,NULL,NULL);
   if(n==0)
       return 0;
/*   把每次接收到的 recvdata[n]依次放到
data中 */


}
我想循环把每次收到的数据全部放到data中,因为长度不确定,所以不能char data[len];
如果每次先 malloc,再memcpy,再free,效率又太低了,请问怎么做?
谢谢

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2007-09-29 13:26 |只看该作者
你做得很对。
就这样,把 MAX 改大点就可以了。

论坛徽章:
0
3 [报告]
发表于 2007-09-29 13:30 |只看该作者
................

[ 本帖最后由 hyrish 于 2007-9-29 13:32 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-09-29 13:31 |只看该作者
我也经常遇到这种问题
等待更好解决办法
将MAX改大点只会浪费内存空间

论坛徽章:
0
5 [报告]
发表于 2007-09-29 13:35 |只看该作者
是啊,效率太低了。。

[ 本帖最后由 darkslack 于 2007-9-29 13:37 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2007-09-29 13:48 |只看该作者
原帖由 hyrish 于 2007-9-29 13:31 发表
等待更好解决办法
将MAX改大点只会浪费内存空间

但是“等待更好解决方法”会浪费脑细胞,不管是对你来说,还是对你的雇主来说,脑细胞都比内存条更值钱。
当然了,内存受限系统另行考虑。

论坛徽章:
0
7 [报告]
发表于 2007-09-29 13:56 |只看该作者
怎么不行啊?如果服务器发送100字节,第一次recvfrom时收到十个字节,第二次收
n就是0;  MAX为10仅仅是演示
#define MAX 10
int n;
int total;
char recvdata[MAX];
char *data=NULL;
  while(1){
       n=recvfrom(sockfd,recvdata,MAX,0,NULL,NULL);
       total+=n;
       if(n==0)
              return 0;
       else{
               char *tmpdata=(char *)malloc(total);
               if(data!=NULL){
               memcpy(tmpdata,data,total-n);}
               memcpy(&tmpdata[total-n],recvdata,total);
               free(data);
               data=tmpdata;

           }

      }

}

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2007-09-29 13:59 |只看该作者
原帖由 darkslack 于 2007-9-29 13:56 发表
怎么不行啊?如果服务器发送100字节,第一次recvfrom时收到十个字节,第二次收
n就是0;  MAX为10仅仅是演示
#define MAX 10
int n;
int total;
char recvdata[MAX];
char *data=NULL;
  while(1){
   ...

UDP 是数据报协议,不是流协议。
一次没读完,第二次读就没了。
读书去吧!

论坛徽章:
0
9 [报告]
发表于 2007-09-29 14:03 |只看该作者
对呀,所以我才问如何得到全部的数据吗!!
因为服务器发送的数据长度不确定,所以不可能定义MAX啊
如果服务器发的数据比MAX(比如MAX=12345678)多(123456789)
那怎么得到服务器的数据呢?

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
10 [报告]
发表于 2007-09-29 14:04 |只看该作者

回复 #1 darkslack 的帖子

原帖由 darkslack 于 2007-9-29 13:24 发表
udp客户端从服务器端接受数据,服务器端发送的数据大小不定

#define MAX 100

char recvdata[MAX]
while(1){
   int n;
   n=recvfrom(sockfd,recvdata,MAX,0,NULL,NULL);
   if(n==0)
       return ...



建议  #define   MAX   1472     , 我看到很多文章说, 建议 udp 的数据包不要超过 1472 , 这跟MTU(最大传送单元)有关,
1472个字节不算多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP