您的位置:首页 > 其它

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

2010-08-28 00:34 417 查看
服务器端通过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经理悲剧生活大曝光调查!


cugb_cat

发短消息

加为好友

cugb_cat 当前离线

UID9418874 帖子11672 精华6 积分21628 可用积分21628 信誉积分110 专家积分439 (本版:120)空间积分0 阅读权限100 性别男 来自北京海淀中关村 在线时间6,795 小时 注册时间2005-11-27 最后登录2010-08-27









广告杀手



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

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





2楼 发表于 2008-01-24 21:59 | 只看该作者

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

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

DNS_WXC

发短消息

加为好友

DNS_WXC 当前离线

UID20654147 帖子37 精华0 积分37 可用积分37 信誉积分0 专家积分0 (本版:)空间积分0 阅读权限10 在线时间小时 注册时间2007-12-14 最后登录2008-02-24









侠客



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

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





3楼 发表于 2008-01-24 22:03 | 只看该作者

但是我使用了一个协议,这个协议定义如下:
struct stu
{
char name[10];
int num;
int age;
char addr[15];
}*p;
仍然不知怎么用??
请求指点。。。
数据中心该走向开放还是封闭? | IT应用你算老几?| 免费顶级Unix/Linux系统集群课程 | IT经理悲剧生活大曝光调查!


cugb_cat

发短消息

加为好友

cugb_cat 当前离线

UID9418874 帖子11672 精华6 积分21628 可用积分21628 信誉积分110 专家积分439 (本版:120)空间积分0 阅读权限100 性别男 来自北京海淀中关村 在线时间6,795 小时 注册时间2005-11-27 最后登录2010-08-27









广告杀手



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

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





4楼 发表于 2008-01-24 22:05 | 只看该作者

回复 #3 DNS_WXC 的帖子

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

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


JohnBull

发短消息

加为好友

JohnBull 当前离线

UID2428608 帖子7763 精华5 积分5807 可用积分5807 信誉积分100 专家积分20 (本版:20)空间积分0 阅读权限100 性别男 来自北京丰台 在线时间382 小时 注册时间2002-08-27 最后登录2010-08-23











版主



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

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





5楼 发表于 2008-01-26 02:36 | 只看该作者

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 你的

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经理悲剧生活大曝光调查!

flf21

发短消息

加为好友

flf21 当前离线

UID7983864 帖子626 精华0 积分1038 可用积分1038 信誉积分100 专家积分0 (本版:)空间积分0 阅读权限30 性别男 来自林城 在线时间8 小时 注册时间2004-10-29 最后登录2010-05-07











风云使者



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

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





6楼 发表于 2008-01-26 04:55 | 只看该作者

QUOTE:
原帖由 DNS_WXC 于 2008-1-24 21:54 发表


服务器端通过send函数,发送数据给客户端。每10条记录发送一次(即每当发送缓冲区中有10条记录时,就调用一次send)。
在设置时,服务器端的发送缓冲区与客户端的接受缓冲区一样大小。
但是在客户 ...

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

__________________________________

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




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: