- 论坛徽章:
- 0
|
我的实验程序基本流程如下:
客户端:
- readagain:
- while( (nbytes = read(servfd, files ,sizeof(files) ) ) >= 0 )
- {
- if( nbytes == 0 )
- {
- printf( "文件传送完毕\n" );
- break;
- }
- writeagain:
- nwritten = write( fd, files, nbytes );
- if( nwritten <= 0 )
- {
- if( (nwritten < 0 ) && (errno == EINTR ) )
- goto writeagain;
- }
- }
- if( (nbytes < 0) && (errno ==EINTR) )
- goto readagain;
- //打印刚接受的文件的内容
- print_receive_file();
-
- //分析刚才接收的文件结果存入文件result
- do_parse( int recvfd );
- //将result发给服务器
- memset( files, '\0', sizeof(files) );
- readagain2:
- while( (nbytes = read(recvfd, files ,sizeof(files) ) ) >= 0 )
- {
- if( nbytes == 0 )
- {
- printf( "文件传送完毕\n" );
- break;
- }
- writeagain2:
- nwritten = write( servfd, files, nbytes );
- if( nwritten <= 0 )
- {
- if( (nwritten < 0 ) && (errno == EINTR ) )
- goto writeagain2;
- }
- }
- if( ( nbytes < 0 ) && ( errno == EINTR ) )
- goto readagain2;
- ............
复制代码
其中服务器端基本上与客户端差不多,只是先发送文件给客户端,然后再接收客户端的文件,现在的问题是,客户端确实接收到了服务器发过来的文件,但是在却print_receive_file();没有打印出来,也就是说还一直处于接收文件的循环中没有跳出来,如果在服务器代码 发送给客户端文件和服务器接收客户端文件中间加上一句
shutdown( sockfd, SHUT_WD );
也就是关闭服务器端的写,那么结果就是客户端可以执行print_receive_file();以及以后的代码了,也就是正常了。
现在我想不在服务器端调用shutdown( sockfd, SHUT_WD );
同时又让客户端正确判断到读取文件完毕,执行下面的操作,那么我该怎么修改客户端或者服务器端的代码呢???
另外,我在客户端中判断文件读完了那句
改成
- if( (nbytes == 0 ) || ( files[nbytes-1] == EOF ) )
复制代码
也没用
请教各位你们一般是怎样判断的呢?或者有没有比较好一点的实例代码?
谢谢 |
|