关于recv函数只能接受一次数据

来源:互联网 发布:抽奖软件 编辑:程序博客网 时间:2024/05/22 00:10
服务器端通过send函数,发送数据给客户端。每10条记录发送一次(即每当发送缓冲区中有10条记录时,就调用一次send)。
      在设置时,服务器端的发送缓冲区与客户端的接受缓冲区一样大小。
      但是在客户端调用recv函数时,却始终得不到理想的结果。。
      每次只能接受到前10条记录,而后边的却接受不到。。
我是这样实现的:
while ((num=recv(fd,recvbuf,MAXDATASIZE,0))!=-1){
                             recvbuf[num]='/0';
                p = (struct test *)recvbuf;
                                for(i=0;;i++,p++)
                          {进行每条记录的输出;}
难道接受数据的时候循环有问题??
怎么实现??


数据中心该走向开放还是封闭? | IT应用你算老几?| 免费顶级Unix/Linux系统集群课程 | IT经理悲剧生活大曝光调查!
 

广告杀手

帖子
11672 
主题
218 
精华
6 
可用积分
21628  
专家积分
439 (本版:120)
来自
北京海淀中关村 
在线时间
6,795 小时 
注册时间
2005-11-27 
最后登录
2010-08-27 

状态:...保密...

[微博] [博客] [短信]


 

传输数据需要制定个协议,哪怕简单的约定,可以使用一个长度,或者使用结束标志,都可以。
__________________________________
欢迎访问ToFree社区
www.tofree.org


数据中心该走向开放还是封闭? | IT应用你算老几?| 免费顶级Unix/Linux系统集群课程 | IT经理悲剧生活大曝光调查!
  

侠客

帖子
37 
主题
19 
精华
0 
可用积分
37  
专家积分
0 (本版:0)
在线时间
小时 
注册时间
2007-12-14 
最后登录
2008-02-24 

状态:...当前离线...

[微博] [博客] [短信]


 

但是我使用了一个协议,这个协议定义如下:
struct stu
{
char name[10];
int num;
int age;
char addr[15];
}*p;
仍然不知怎么用??
请求指点。。。


数据中心该走向开放还是封闭? | IT应用你算老几?| 免费顶级Unix/Linux系统集群课程 | IT经理悲剧生活大曝光调查!
  

广告杀手

帖子
11672 
主题
218 
精华
6 
可用积分
21628  
专家积分
439 (本版:120)
来自
北京海淀中关村 
在线时间
6,795 小时 
注册时间
2005-11-27 
最后登录
2010-08-27 

状态:...保密...

[微博] [博客] [短信]


 

回复 #3 DNS_WXC 的帖子

你直接传结构体?
__________________________________
欢迎访问ToFree社区
www.tofree.org


数据中心该走向开放还是封闭? | IT应用你算老几?| 免费顶级Unix/Linux系统集群课程 | IT经理悲剧生活大曝光调查!
  

版主

帖子
7763 
主题
187 
精华
5 
可用积分
5807  
专家积分
20 (本版:20)
来自
北京丰台 
在线时间
382 小时 
注册时间
2002-08-27 
最后登录
2010-08-23 

状态:...当前离线...

[微博] [博客] [短信]


 



QUOTE:
原帖由 DNS_WXC 于 2008-1-24 21:54 发表
服务器端通过send函数,发送数据给客户端。每10条记录发送一次(即每当发送缓冲区中有10条记录时,就调用一次send)。
      在设置时,服务器端的发送缓冲区与客户端的接受缓冲区一样大小。
      但是在客户端调用recv函数时,却始终得不到理想的结果。。
      每次只能接受到前10条记录,而后边的却接受不到。。
我是这样实现的:
while ((num=recv(fd,recvbuf,MAXDATASIZE,0))!=-1){
                             recvbuf[num]='/0';
                p = (struct test *)recvbuf;
                                for(i=0;;i++,p++)
                          {进行每条记录的输出;}
难道接受数据的时候循环有问题??
怎么实现??



1 为什么“每10条记录发送一次”,给自己找麻烦?如果最后一次发送不到10个记录怎么办?特殊处理?每条记录send一次不行吗?(别跟我扯什么效率)

2 你的
  1. recvbuf[num]='/0';
复制代码
是什么意思???你处理的究竟是结构体原始数据还是格式化串?

3 你能确保server发过来的数据是正确的吗?抓过包没有?

4 在流式套接字上直接传输结构体,你有没有正确处理字节序问题和结构体对齐问题?

5 设计通信协议的消息格式的时候,永远不要用int/long之类甚至char也不要用,应该用u_int32_t/u_int16_t/u_int8_t...

6 ......

劝你重新设计协议,返工吧。
__________________________________
本人言论基地已经转移至Google Buzz.
我的twitter = @sched_yield
--------------------------------------------
政治立场坐标 0.8
文化立场坐标 0.8
经济立场坐标 0.2
--------------------------------------------
http://zh.wikipedia.org/wiki/User:JohnBull


数据中心该走向开放还是封闭? | IT应用你算老几?| 免费顶级Unix/Linux系统集群课程 | IT经理悲剧生活大曝光调查!
  

风云使者

帖子
626 
主题
22 
精华
0 
可用积分
1038  
专家积分
0 (本版:0)
来自
林城 
在线时间
8 小时 
注册时间
2004-10-29 
最后登录
2010-05-07 

状态:...当前离线...

[微博] [博客] [短信]


 



QUOTE:
原帖由 DNS_WXC 于 2008-1-24 21:54 发表
服务器端通过send函数,发送数据给客户端。每10条记录发送一次(即每当发送缓冲区中有10条记录时,就调用一次send)。
      在设置时,服务器端的发送缓冲区与客户端的接受缓冲区一样大小。
      但是在客户 ...


最好有打印日志,这样容易查错。。。
__________________________________

茶浓水清,请君自品,
人生苦短,何需多思,
怎能多思,如何多思.