免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lianghaibo_lhb
打印 上一主题 下一主题

为什么只能从socket中读出1460个字节 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2003-06-16 11:40 |只看该作者

为什么只能从socket中读出1460个字节

导致读到空就返回了???
你是非阻塞模式吗

如果是阻塞模式那么会一直等

论坛徽章:
0
12 [报告]
发表于 2003-06-16 11:48 |只看该作者

为什么只能从socket中读出1460个字节

读socket时程序判断返回字节数小于 buff大小就返回,这样会不会由于读socket太快导致程序结束??

论坛徽章:
0
13 [报告]
发表于 2003-06-16 11:51 |只看该作者

为什么只能从socket中读出1460个字节

如果像你上面做的话应该是有错的
因为对方发送时一次发送的数据量比较大的话都是分成多个包发过来

所以接收时也要多次接收
一直到总和与对方发的包长度相等

论坛徽章:
0
14 [报告]
发表于 2003-06-16 11:56 |只看该作者

为什么只能从socket中读出1460个字节

那怎样控制client端接收的包的总和与server端发送的相等呢?

论坛徽章:
0
15 [报告]
发表于 2003-06-16 14:46 |只看该作者

为什么只能从socket中读出1460个字节

[quote]原帖由 "lianghaibo_lhb"]那怎样控制client端接收的包的总和与server端发送的相等呢?[/quote 发表:
     
数据包里加个包长位
read、write挺好用的,判断返回值是否等于发送包长

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
16 [报告]
发表于 2003-06-16 15:18 |只看该作者

为什么只能从socket中读出1460个字节

是由于
if (number < MAXDATASIZE)
break;
引起的,如果客户端socket接受缓冲区还没有接受到服务段传输数据过来,
recv被强行break。事实上,网络中传输的数据往往没有本地的while(1)跑得快。

解决的办法是:
1、用select。
2、累加接受的数据长度,直到某一固定值。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
17 [报告]
发表于 2003-06-16 15:21 |只看该作者

为什么只能从socket中读出1460个字节

另外,建议对recv的返回值做处理。
如果用readn或read也一样。包括对于返回值为0的处理。

论坛徽章:
0
18 [报告]
发表于 2003-06-16 16:25 |只看该作者

为什么只能从socket中读出1460个字节

循环读,直到两边的交易包相同为止。
如果不用应答的话,且对方在传好数据后会关闭socket
可以用如下代码来收包

  1. for (;;) {
  2.                                 int iRc;
  3.                                 i++;
  4.                                 n=0;
  5.                 n=read(newsock,buf+m,2048);                               
  6.                                 if(n==0) {
  7.                                         int mask = (1 << newsock);
  8.    
  9.                                         switch (select(32, (fd_set *)&mask, 0, 0, &two)) {
  10.                                                 case -1:
  11.                                                         perror("select");
  12.                                                         LogRec("TcpServer","select %s",strerror(errno));
  13.                                                         exit(-1);
  14.                                                 case 0:
  15.                                                         continue;
  16.                                                 default:
  17.                                                         close(newsock);
  18.                                                         flag=1;
  19.                                         }
  20.                                 }
  21.                                 if(flag==1)
  22.                                      break;
  23.                                 LOG("tcptmp.log","tcp 第%d次 receive \n %s",i,buf+m);
  24.                                 m=n;
  25.                         }
复制代码

论坛徽章:
0
19 [报告]
发表于 2003-06-16 18:46 |只看该作者

为什么只能从socket中读出1460个字节

select(32, (fd_set *)&mask, 0, 0, &two))
中的two和32是什么含义??

论坛徽章:
0
20 [报告]
发表于 2003-06-19 18:37 |只看该作者

为什么只能从socket中读出1460个字节

  1.      int mask = (1 << newsock);
复制代码

什么意思??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP