免费注册 查看新帖 |

Chinaunix

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

socket传送jpg不成功,郁闷。。。。求助!!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-10 16:39 |只看该作者 |倒序浏览
客户端关键代码:
while(rfile.is_open())
                  {
                          memset(buffer,0,sizeof(buffer));
                          rfile.read(buffer,sizeof(buffer)-1);
                    int readLen = rfile.gcount();
                    printf("send: %d bytes\n",readLen);
                    printf("send: %d bytes\n",strlen(buffer));
                   // strcpy(buffer,"dfdsd");
                                if(send(sockfd,buffer,strlen(buffer),0)==-1)
              {
                fprintf(stderr,"Write Error:%s\n",strerror(errno));
                exit(1);
              }
                    
                    if(rfile.eof())
                       break;
                  }
服务器关键代码:
        int getnum=0;
        do
        {
                nbytes=0;
                memset(databuf,0,sizeof(databuf));
                if((nbytes=recv(new_fd,databuf, file_size-getnum,0))==-1)
                                        {
                                                fprintf(stderr,"Read Error:%s\n",strerror(errno));
                                                exit(1);
                                        }
                       databuf[nbytes]='\0';
                                        printf("receive: %d bytes\n",nbytes);                                       
                getnum+=nbytes;
                 
                wfile.write(databuf, nbytes);                              
        }while(getnum<file_size);

客户端错误为:
send: 1023 bytes
send: 4 bytes
send: 1023 bytes
send: 150 bytes
send: 1023 bytes
send: 68 bytes
send: 1023 bytes
send: 124 bytes
send: 1023 bytes
send: 29 bytes
send: 1023 bytes
send: 129 bytes
send: 1023 bytes
send: 55 bytes
send: 312 bytes
send: 14 bytes
send over
服务器端错误为:
receive 0 bytes
....
为什么readLen和strlen(buffer)长度不等,到底从文件读到了多少数据?
为什么服务器端收到0字节

论坛徽章:
0
2 [报告]
发表于 2009-01-10 16:44 |只看该作者

回复 #1 fenglimei0907 的帖子

补充jpg文件是这样打开的
fstream rfile;
rfile.open("read.jpg", ios:ut  | ios::in  | ios::binary);

我是在linux下做的,我其实是在做嵌入式中从2410开发板上采集到视频,并发送到PC端

大家帮忙啊

论坛徽章:
0
3 [报告]
发表于 2009-01-10 18:16 |只看该作者
因为你读的是三进制文件,用STRLEN无意义

服务器端读到0可能是file_size-getnum==0

也可能是对端关闭了


但你给出的代码不够,无法确认

论坛徽章:
0
4 [报告]
发表于 2009-01-10 19:01 |只看该作者
原帖由 alpbrook 于 2009-1-10 18:16 发表
因为你读的是三进制文件,用STRLEN无意义

服务器端读到0可能是file_size-getnum==0

也可能是对端关闭了


但你给出的代码不够,无法确认


有三进制文件???

给楼主一个我写的socket传文件的例子参考下吧
tcp socket,windows和linux通用的。二进制方式读写。
http://bbs.chinaunix.net/viewthread.php?tid=1274290

论坛徽章:
0
5 [报告]
发表于 2009-01-10 21:46 |只看该作者

回复 #1 fenglimei0907 的帖子

服务器端代码:
int sockfd,new_fd;
        struct sockaddr_in  addr,client_addr;
        socklen_t sin_size;
        sockfd=socket(AF_INET,SOCK_STREAM,0);
        if(sockfd<0)
        {
                fprintf(stderr,"Socket Error:%s\n",strerror(errno));
                exit(1);
        }
        bzero(&addr,sizeof(struct sockaddr_in));
        addr.sin_family=AF_INET;
        addr.sin_addr.s_addr=htonl(INADDR_ANY);
        addr.sin_port=htons(SERVER_PORT);
        if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0)
        {
                fprintf(stderr,"Bind Error:%s\n",strerror(errno));
                exit(1);
        }
        /*监听sockfd描述符*/
                         if(listen(sockfd, WAITBUF)==-1)
                         {
                                fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
                                exit(1);
                         }

                 
                  fstream wfile;
       
                        char databuf[1024];
                  wfile.open ("wfile.jpg", ios:ut  | ios::binary | ios::trunc);
                        long file_size=0;//保存图片大小
                        int nbytes=0;
                         while(1)
                         {
                                 /*服务器阻塞,直到客户程序建立连接*/
        sin_size=(socklen_t)sizeof(struct sockaddr_in);
        if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
        {
                fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
                exit(1);
                           }
        fprintf(stderr,"Server get connection from %s\n",
                                        inet_ntoa(client_addr.sin_addr));
                                
                                 /*发送start信号,通知客户端开始发送图片*/
                                 printf("server send -start\n";
                                 if(send(new_fd,"I am ready",strlen("I am ready",0)==-1)
        {
         fprintf(stderr,"Write Error:%s\n",strerror(errno));
         exit(1);
        }
        /*接收图片大小*/      
        memset(databuf,0,sizeof(databuf));   
        if((nbytes=recv(new_fd,databuf, 1024,0))==-1)
                                {
                                        fprintf(stderr,"Read Error:%s\n",strerror(errno));
                                        exit(1);
                                 }
                                 databuf[nbytes]='\0';
                                 file_size=atol(databuf);
                                 printf("recv filesize:%ld\n",file_size);
        /*接收图片数据*/
        int getnum=0;
        do
        {
                nbytes=0;
                memset(databuf,0,sizeof(databuf));
                if((nbytes=recv(new_fd,databuf, file_size-getnum,0))==-1)
                                        {
                                                fprintf(stderr,"Read Error:%s\n",strerror(errno));
                                                exit(1);
                                        }
                       databuf[nbytes]='\0';
                                        printf("receive: %d bytes\n",nbytes);                                       
                getnum+=nbytes;
                 
                wfile.write(databuf, nbytes);                              
        }while(getnum<file_size);
        
        printf("recv over.\n";            
                                /*这个通信已经结束*/
        close(new_fd);
                                /*循环下一个*/  
                         }
                        close(sockfd);
      wfile.close();
客户端代码:
  int sockfd,port;
        struct sockaddr_in      addr;
        
        if(argc!=3)
        {
                fprintf(stderr,"Usage:%s server_ip server_port\n",argv[0]);
                exit(1);
        }
        
        if((port=atoi(argv[2]))<0)
        {
                fprintf(stderr,"Usage:%s server_ip server_port\n",argv[0]);
                exit(1);
        }
        
        sockfd=socket(AF_INET,SOCK_STREAM,0);
        if(sockfd<0)
        {
                fprintf(stderr,"Socket  Error:%s\n",strerror(errno));
                exit(1);
        }      
        /*填充服务器端的资料*/
        bzero(&addr,sizeof(struct sockaddr_in));
        addr.sin_family=AF_INET;
        addr.sin_port=htons(port);
        if(inet_aton(argv[1],&addr.sin_addr)<0)
        {
                fprintf(stderr,"Ip error:%s\n",strerror(errno));
                exit(1);
        }
      
                        /*客户程序发起连接请求*/
                         if(connect(sockfd,(struct sockaddr *)(&addr),sizeof(struct sockaddr))==-1)
                                {
                                  fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
                                  exit(1);
                                }

      
      fstream rfile;
       
                        char buffer[1024];
                        memset(buffer,0,sizeof(buffer));
                  rfile.open("2.jpg", ios:ut  | ios::in  | ios::binary);
                  int len=sizeof(struct sockaddr_in);       
                 
                 /*连接成功*/
                  int nbytes=0;
                  while(1)
                  {/*服务器端发出命令后,才开始发送图片*/
                                if((nbytes=recv(sockfd,buffer, 1024,0))==-1)
                                {
                                        fprintf(stderr,"Read Error:%s\n",strerror(errno));
                                        exit(1);
                                 }
                                 buffer[nbytes]='\0';
                                 printf("client recv -%s-\n",buffer);
                                 if(strcmp(buffer,"I am ready"==0)
               {
                       printf("begin send\n";
                       break;
               }
               else
               {
                       printf("waiting send\n";       
               }
      }
                        /*获得文件大小*/
                        FILE* stream;
                        stream = fopen("2.jpg","r";
                        long file_size;
                        fseek(stream,0,SEEK_END);
                        file_size=ftell(stream);
                        fclose(stream);
                       
                        sprintf(buffer,"%ld",file_size);
       
                        /*首先发送文件大小*/
                        if(send(sockfd,buffer,strlen(buffer),0)==-1)
      {
        fprintf(stderr,"Write Error:%s\n",strerror(errno));
        exit(1);
      }
       printf("sended filesize:%s\n",buffer);
      
   
                  while(rfile.is_open())
                  {
                          memset(buffer,0,sizeof(buffer));
                          rfile.read(buffer,sizeof(buffer)-1);
                    int readLen = rfile.gcount();
                    printf("send: %d bytes\n",readLen);
                    printf("send: %d bytes\n",strlen(buffer));
                   // strcpy(buffer,"dfdsd";
                                if(send(sockfd,buffer,strlen(buffer),0)==-1)
              {
                fprintf(stderr,"Write Error:%s\n",strerror(errno));
                exit(1);
              }
                    
                    if(rfile.eof())
                       break;
                  }
                   printf("send over\n";
                  
                   /*发出传送完毕信号*/
                 //  send(sockfd,"0",1,0);
       rfile.close();
       close(sockfd);

论坛徽章:
0
6 [报告]
发表于 2009-01-10 21:47 |只看该作者

回复 #1 fenglimei0907 的帖子

...

[ 本帖最后由 fenglimei0907 于 2009-1-10 22:16 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-01-10 21:48 |只看该作者

完整代码

.......

[ 本帖最后由 fenglimei0907 于 2009-1-10 22:10 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-01-10 21:48 |只看该作者

完整代码

...

[ 本帖最后由 fenglimei0907 于 2009-1-10 22:11 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-01-10 21:49 |只看该作者

回复 #8 fenglimei0907 的帖子

...

[ 本帖最后由 fenglimei0907 于 2009-1-10 22:11 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2009-01-10 22:42 |只看该作者

还是有点疑问!!!

回复3楼:多谢提醒,我把file_size-getnum和strlen都改成了1024,现在发送和接收的字节数都是正确的,但是接收后的文件大小是0字节,我还是看不出问题出在哪儿,难道fstream有什么问题吗?
回复4楼:多谢,您的代码是对的,我测过了,但是我的为什么就写不进去呢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP