免费注册 查看新帖 |

Chinaunix

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

[C] 关于套接字的recv函数 ---急 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-22 16:08 |只看该作者 |倒序浏览
写了一个客户端与服务器端的程序,发现有问题:
服务器端通过send函数将数据发送给客户端的时候,没有问题,存储在sendbuf缓冲区内:
"Linux", '\0' <repeats 15 times>, "34\000\000FreeBSD", '\0' <repeats 13 times>,
"67\000\000Helo", '\0' <repeats 16 times>, "45", '\0' <repeats 29 times>
以上即为发送的缓冲区的数据。
但是客户端通过套接字函数recv进行接收时,却只接受了“Linux”,请教一下:
如何才能把数据完全读过来??
谢谢!!!求救!!

论坛徽章:
0
2 [报告]
发表于 2008-01-22 16:11 |只看该作者
你在客户端用PRINTF打印的?printf遇\0就停了,是不是已经接收到了你没有发现,用GCC调试一下看看

论坛徽章:
0
3 [报告]
发表于 2008-01-22 16:14 |只看该作者
通信协议不指定消息长度是缺乏常识性的做法

论坛徽章:
0
4 [报告]
发表于 2008-01-22 16:16 |只看该作者
原帖由 anthony1983 于 2008-1-22 16:14 发表
通信协议不指定消息长度是缺乏常识性的做法


我初学网络编程的时候也是搞不懂这个问题.

建议楼主对于应用层的协议好好考虑一下, 一般简单的情况下就是先发送此次传送的数据大小, 然后再发送. 而接收方也是, 先接收此次接收数据的大小, 然后再接收这些多的字节数.

论坛徽章:
0
5 [报告]
发表于 2008-01-22 16:22 |只看该作者
"Linux\000\000\000[\000B鋓\000B\024\n\023B潸?磕??緿??坷糪000@\177\003\000\000\001\000\000\000P?aB\177\200\000@,X\001@]\000\000\0008Z\001@\200??縗003綷000@訹\001@\200c\001@\001\000\000\000\000\000\000\000\201T\001B闬204\004\b鳿016\023B"
这是recvbuf的内容。可以发现没有接受到。
下面是我客户端接收数据的程序:
if ((numbytes=recv(fd,recvbuf,MAXDATASIZE,0)) == -1){
                perror("recv( ) failed!!\n");
                exit(1);
                }
        recvbuf[numbytes]='\0';
        printf("TCP Server Message:%s\n",recvbuf);

论坛徽章:
0
6 [报告]
发表于 2008-01-22 16:29 |只看该作者
不知scutan可否讲的稍微详细一点??
学习学习!!!

论坛徽章:
0
7 [报告]
发表于 2008-01-22 16:35 |只看该作者
原帖由 DNS_WXC 于 2008-1-22 16:29 发表
不知scutan可否讲的稍微详细一点??
学习学习!!!


我也没编过很大的程序, 都是自己写了耍的.
在发送端的话:

  1. char buf[] = "hello world";
  2. int count = strlen(buf);
  3. if (send(sockfd, &count , sizeof(int), 0) != sizeof(int))
  4. {
  5. }
  6. if (send(sockfd, buf, count, 0) != count)
  7. {
  8. }
复制代码

在接收端:

  1. char *buf;
  2. int count;
  3. if ((n = recv(sockfd, &count, sizeof(int), MSG_WAITALL)) != sizeof(int))
  4. {
  5. }
  6. buf = (char *)malloc(count+1);
  7. if (buf == NULL)
  8. {
  9. }
  10. if ((n = recv(sockfd, buf, count, MSG_WAITALL)) != count)
  11. {
  12. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2008-01-22 16:51 |只看该作者
刚才看到scutan提供的简单架构,测试了一下,
j=send(connectfd,sendbuf,strlen(sendbuf),0);
发现原来send的返回值j是5。也就意味着只是发送了一个“Linux”数据,
那如何实现呢?
是不是在发送方与接受方都要不停的循环使用send与recv?

论坛徽章:
0
9 [报告]
发表于 2008-01-22 18:30 |只看该作者
问题已经解决...
原来是发送方调用时,改为以下的
j=send(connectfd,sendbuf,sizeof(sendbuf),0);即可
问题虽小,却能影响效率。。就是数据传输时的长度一定要搞定!!
只需将
strlen(sendbuf)改为sizeof(sendbuf)即可!!
再次感谢各位的帮忙!!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2008-01-22 18:32 |只看该作者
再一次强调“语义”
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP