免费注册 查看新帖 |

Chinaunix

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

[C] 关于recv函数只能接受一次数据 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-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++)
                          {进行每条记录的输出;}
难道接受数据的时候循环有问题??
怎么实现??

论坛徽章:
0
2 [报告]
发表于 2008-01-24 21:59 |只看该作者
传输数据需要制定个协议,哪怕简单的约定,可以使用一个长度,或者使用结束标志,都可以。

论坛徽章:
0
3 [报告]
发表于 2008-01-24 22:03 |只看该作者
但是我使用了一个协议,这个协议定义如下:
struct stu
{
char name[10];
int num;
int age;
char addr[15];
}*p;
仍然不知怎么用??
请求指点。。。

论坛徽章:
0
4 [报告]
发表于 2008-01-24 22:05 |只看该作者

回复 #3 DNS_WXC 的帖子

你直接传结构体?

论坛徽章:
0
5 [报告]
发表于 2008-01-26 02:36 |只看该作者
原帖由 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 ......

劝你重新设计协议,返工吧。

论坛徽章:
0
6 [报告]
发表于 2008-01-26 04:55 |只看该作者
原帖由 DNS_WXC 于 2008-1-24 21:54 发表
服务器端通过send函数,发送数据给客户端。每10条记录发送一次(即每当发送缓冲区中有10条记录时,就调用一次send)。
      在设置时,服务器端的发送缓冲区与客户端的接受缓冲区一样大小。
      但是在客户 ...

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

论坛徽章:
0
7 [报告]
发表于 2008-01-26 15:43 |只看该作者
你用的什么传输协议? tcp ? udp? tcp是面向字节流的,不会按数据包返回结果的。udp倒可以,但是udp的流量控制会丢数据的。具体实现都有特定的设置和限制的,^_^.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP