免费注册 查看新帖 |

Chinaunix

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

网络编程中关于判断是否接收一个文件完毕的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-03 10:26 |只看该作者 |倒序浏览
我的实验程序基本流程如下:

客户端:


  1. readagain:
  2. while( (nbytes = read(servfd, files ,sizeof(files) ) ) >= 0 )
  3. {
  4.     if( nbytes == 0 )
  5.     {
  6.         printf( "文件传送完毕\n" );
  7.         break;
  8.     }

  9. writeagain:
  10.     nwritten = write( fd, files, nbytes );
  11.     if( nwritten <= 0 )
  12.     {
  13.         if( (nwritten < 0 ) && (errno == EINTR ) )
  14.             goto writeagain;
  15.     }
  16. }

  17. if( (nbytes < 0) && (errno ==EINTR) )
  18.     goto readagain;

  19. //打印刚接受的文件的内容
  20. print_receive_file();

  21. //分析刚才接收的文件结果存入文件result
  22. do_parse( int recvfd );

  23. //将result发给服务器

  24. memset( files, '\0', sizeof(files) );

  25. readagain2:
  26. while( (nbytes = read(recvfd, files ,sizeof(files) ) ) >= 0 )
  27. {
  28.     if( nbytes == 0 )
  29.     {
  30.         printf( "文件传送完毕\n" );
  31.         break;
  32.     }

  33. writeagain2:
  34.     nwritten = write( servfd, files, nbytes );
  35.     if( nwritten <= 0 )
  36.     {
  37.         if( (nwritten < 0 ) && (errno == EINTR ) )
  38.             goto writeagain2;
  39.     }
  40. }

  41. if( ( nbytes < 0 ) && ( errno == EINTR ) )
  42.     goto readagain2;

  43. ............

复制代码


其中服务器端基本上与客户端差不多,只是先发送文件给客户端,然后再接收客户端的文件,现在的问题是,客户端确实接收到了服务器发过来的文件,但是在却print_receive_file();没有打印出来,也就是说还一直处于接收文件的循环中没有跳出来,如果在服务器代码  发送给客户端文件和服务器接收客户端文件中间加上一句
shutdown( sockfd,  SHUT_WD );
也就是关闭服务器端的写,那么结果就是客户端可以执行print_receive_file();以及以后的代码了,也就是正常了。

现在我想不在服务器端调用shutdown( sockfd,  SHUT_WD );
同时又让客户端正确判断到读取文件完毕,执行下面的操作,那么我该怎么修改客户端或者服务器端的代码呢???

另外,我在客户端中判断文件读完了那句

  1. if ( nbytes == 0 )
复制代码

改成

  1. if( (nbytes == 0 ) || ( files[nbytes-1] == EOF ) )
复制代码

也没用

请教各位你们一般是怎样判断的呢?或者有没有比较好一点的实例代码?
谢谢

论坛徽章:
0
2 [报告]
发表于 2007-02-03 14:33 |只看该作者

  1. while( (nbytes = read(servfd, files ,sizeof(files) ) ) >= 0 )
  2. {
  3.     if( nbytes == 0 )
  4.     {
  5.         printf( "文件传送完毕\n" );
  6.         break;
  7.     }
复制代码


楼主这句代码好像有问题

[ 本帖最后由 只爱殷澍蕾 于 2007-2-3 14:35 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-02-03 16:38 |只看该作者
那具体是该怎么修改呢?

我在资料上看到如果读的结果返回0,那就表示读到文件结尾了啊。
莫非我记错了?

论坛徽章:
0
4 [报告]
发表于 2007-02-03 18:32 |只看该作者
原帖由 kevert 于 2007-2-3 16:38 发表
那具体是该怎么修改呢?

我在资料上看到如果读的结果返回0,那就表示读到文件结尾了啊。
莫非我记错了?


发送方发送文件数据之前先发送数据实际长度,接收方根据此长度读取。
read返回0正常情况下是连接断了。

论坛徽章:
0
5 [报告]
发表于 2007-02-04 13:56 |只看该作者
read返回0是连接断了?
但是后面还可以发送文件给服务器啊

论坛徽章:
0
6 [报告]
发表于 2007-02-04 18:03 |只看该作者
原帖由 kevert 于 2007-2-4 13:56 发表
read返回0是连接断了?
但是后面还可以发送文件给服务器啊


不好意思,我说的是接收方

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2007-02-04 19:05 |只看该作者
可以采取控制端口,和文件传输端口分离的方法.

文件传输结束,服务器端关闭那个文件传输端口就自然结束发送了.

论坛徽章:
0
8 [报告]
发表于 2007-02-04 19:53 |只看该作者
原帖由 mq110 于 2007-2-4 19:05 发表
可以采取控制端口,和文件传输端口分离的方法.

文件传输结束,服务器端关闭那个文件传输端口就自然结束发送了.


是,我现在就是这样的,服务器方shutdown()写的操作,然后客户端就知道文件结束了
现在我想的是服务器不要shutdown写操作,然后让客户自己怎样来判断文件结束
难道read返回0不表示文件结束么?

论坛徽章:
0
9 [报告]
发表于 2007-02-05 00:32 |只看该作者
可以用read的返回值判断传输有没有结束,但如果read的结果是0,还要判socket上有没有错

论坛徽章:
0
10 [报告]
发表于 2007-02-05 00:33 |只看该作者
不好意思,看错
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP