看板Programming
标 题Re: [问题] socket linux c 传送档案有时会错误
发信站SayYA 资讯站 (Sun Jan 11 23:30:02 2009)
转信站ptt!news.ntu!news.ncu!News.Math.NCTU!SayYa
※ 引述《[email protected] (就是爱希尔)》之铭言:
> 目前在练习写linux c socket的练习
> 在程式中用一个while回圈来接收Client端送来要求多个档名的功能
> 在档案大小都很小的时候,都很正常接收,但如果档案大小很大>>BUF_SIZE(1024)时
> 就会发生传输有问题,常常Client端接收到的档案大小有问题
> 可是我在传档案内容有另一个while回圈去读要开启的档案的大小
> 再去送到socket
> 传输档案流程:
> server先接收到档名,开档去把档案大小传给client,接着server就把档案内容传给
> cleint。
> 会不会是server连续传两次,会造成有这种问题,还是要改成client传给server一个讯息
> 之後,server再传给client,尽量避免某一方连续传两次的情况出现,
> 想提出来看有没有再传档案的时候也有同样的问题,
> 还有大家再写socket的时候,在read之前都会习惯把buffer清空吗?
> 因为之前常遇到buffer没有清空而造成程式有问题。谢谢
> while(1){
> memset(buffer,0,sizeof(buffer));
> ret=read(connfd,buffer,BUF_SIZE); //接收档名
> if(ret==0){
> printf("Client Over\n");
> break;
> }
> if((file_fd=open(buffer,O_RDONLY))==-1){
> Error("can't open file");
> }
> filesize=doGetFileSize(buffer,"r"); //得知档案大小的函数
> filesizestr[0]= filesize;
> sprintf(buf,"%d",filesizestr[0]);
> write(connfd,buf,BUF_SIZE); //传档案大小
可以送出 buf 资料长度就好
> memset(buffer,0,sizeof(buffer));
> while((ret=read(file_fd,buffer,BUF_SIZE))>0){ //传档案内容
> write(connfd,buffer,ret);
> }
应该要检查 write 多少资料出去,
没送出去的要补送.
> close(file_fd);
> }
> break;
(PTT 大概也看不到这篇回应)
--
幸福,当我满头白发时,依然能够与你手牵着手攸然散步。
--
※ Origin: SayYA 资讯站 <bbs.sayya.org>
◆ From: 140.116.216.159
1F:推 HILL33LOVE:我把write(connfd,buf,strlen(buf));之 220.136.96.50 01/12 22:25
2F:→ HILL33LOVE:後,就没有问题了,我想问一下,在read 220.136.96.50 01/12 22:26
3F:→ HILL33LOVE:和write这两个,我如果要读read(x,y,Bu 220.136.96.50 01/12 22:27
4F:→ HILL33LOVE:uffer_size),但是在写进socket如果用 220.136.96.50 01/12 22:28
5F:→ HILL33LOVE:write(x,buffer,Buffer_size)的话,假 220.136.96.50 01/12 22:29
6F:→ HILL33LOVE:假设buffer里面的内容没有到buff_size 220.136.96.50 01/12 22:30
7F:→ HILL33LOVE:是不是就变成多的空白部分他也会写到 220.136.96.50 01/12 22:30
8F:→ HILL33LOVE:socket里面造成传输过程会有错误的原因 220.136.96.50 01/12 22:31
9F:→ HILL33LOVE:呢?? 谢谢 220.136.96.50 01/12 22:32
10F:→ Lordaeron:你测一下不就清楚了, 干嘛要问呢125.232.133.117 01/13 13:36