免费注册 查看新帖 |

Chinaunix

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

关于socket 传送文件的问题 [困惑] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-19 21:53 |只看该作者 |倒序浏览
关于socket 传送文件的问题 [困惑]

这几天一直被这个问题困扰着

编写了一个socket 传送BMP 图像的程序

client 向 server 传送client.bmp

但是在server 端接受到的图像不能打开

用 UltraEdit  打开client发送的 client.bmp图像和server接受的图像  server.bmp 对比,

server.bmp文件的前面 1448个字节 与 client.bmp的前1448个字节一样

但是server.bmp文件第1448个字节后的全部字节都为 0x00了

所以 server.bmp 所显示出来的几乎就是黑色的图片了

我的问题是 ---》 传送的是非0值,为什么收了一部分后就全变为0了呢?

请大虾们指点一下,我参考了资料+百度这个问题,还是百思不得其解。


我把我的代码附上

  1. ----------server-----------
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <errno.h>
  7. #include <string.h>
  8. #include <unistd.h>
  9. #include <netinet/in.h>

  10. #define SERVPORT 3333
  11. #define BACKLOG 10
  12. #define MAX_CONNECTED_NO 10
  13. #define MAXDATASIZE 100*100*3+54

  14. int main()
  15. {
  16.          struct sockaddr_in  server_sockaddr,client_sockaddr;
  17.          int sin_size,recvbytes;
  18.          int sockfd,client_fd;
  19.          char buf[MAXDATASIZE];
  20.          int nwrite,i;
  21.        
  22.          FILE *fbmp;
  23.          char bmpdata[100*100*3+54];       
  24.        
  25.         if (( fbmp = fopen("server.bmp", "w+")) == NULL)
  26.                    {
  27.                    printf("Open  server bmp error !\n");
  28.                    exit(-1);
  29.             }

  30.          
  31.          if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
  32.                    perror("socket");
  33.                    exit(1);
  34.          }

  35.    printf("socket success!,sockfd = %d\n",sockfd);
  36.    
  37.    server_sockaddr.sin_family = AF_INET;         
  38.    server_sockaddr.sin_port = htons(SERVPORT);                 
  39.    server_sockaddr.sin_addr.s_addr = INADDR_ANY;
  40.    
  41.    bzero(&(server_sockaddr.sin_zero), 8);
  42.    
  43.    if(bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr)) == -1 ){
  44.        perror("bind");
  45.        exit(1);           
  46.           }                 
  47.          
  48.          printf("bind success!\n");
  49.          
  50.          if(listen(sockfd, BACKLOG) == -1){
  51.                    perror("listen");
  52.                    exit(1);                  
  53.          }
  54.          
  55.          printf("listening - - - \n");
  56.          
  57.          if( (client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1 ){
  58.                     perror("accept");
  59.                     exit(1);
  60.        }
  61.        
  62.         if(( recvbytes = recv(client_fd, bmpdata, MAXDATASIZE, 0)) == -1){
  63.                 perror("recv");
  64.                 exit(1);
  65.         }


  66.     for( i = 0  ; i< MAXDATASIZE ; i++ )
  67.          {   
  68.                    printf("%x - ",bmpdata[i] ) ;
  69.          }

  70. if ( nwrite = fwrite (bmpdata,MAXDATASIZE,1, fbmp  ) < 0)
  71.              {
  72.                      printf("Write  BMP error !\n");
  73.                     exit(-1);
  74.       }

  75.     fclose(fbmp);
  76.     close(sockfd);

  77. }


  78. ---------------client---------------------

  79. #include <sys/types.h>
  80. #include <sys/socket.h>
  81. #include <stdio.h>
  82. #include <stdlib.h>
  83. #include <errno.h>
  84. #include <string.h>
  85. #include <unistd.h>
  86. #include <netinet/in.h>
  87. #include <netdb.h>

  88. #define SERVPORT 3333

  89. #define MAXDATASIZE 100*100*3+54

  90. main( int argc , char *argv[] )
  91. {
  92.          struct hostent *host;
  93.    struct sockaddr_in serv_addr;
  94.          int sockfd,sendbytes;
  95.          char buf[MAXDATASIZE];
  96.          int bmpsize = 0,
  97.              i,
  98.              headersize = 0,
  99.              pixelsize = 0;
  100.          
  101.          FILE *fbmp;
  102.          char bmpdata[100*100*3+54];
  103.          
  104.         if (( fbmp = fopen("client.bmp", "r")) == NULL)
  105.                    {
  106.                    printf("Open client bmp error !\n");
  107.                    exit(-1);
  108.             }   
  109.   

  110.   fseek(fbmp,0,SEEK_SET);
  111.   fread(bmpdata,MAXDATASIZE,1,fbmp);
  112.   
  113.    if( argc < 2) {
  114.                    fprintf(stderr, "Please enter the server's hostname!\n");
  115.                    exit(1);
  116.    }
  117.    
  118.    if( (host = gethostbyname(argv[1])) == NULL ){
  119.               perror("gethostbyname");
  120.               exit(1);          
  121.    }
  122.          
  123.    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
  124.                    perror("socket");
  125.                    exit(1);
  126.    }

  127.    printf("socket success!,socket = %d\n",sockfd);
  128.    
  129.    serv_addr.sin_family = AF_INET;         
  130.    serv_addr.sin_port = htons(SERVPORT);                 
  131.    serv_addr.sin_addr = *( (struct in_addr *)host->h_addr );
  132.    
  133.    bzero(&(serv_addr.sin_zero), 8);
  134.    
  135.    if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1 ){
  136.        perror("connect");
  137.        exit(1);           
  138.     }                 
  139.          
  140.    printf("connect success!\n");
  141.          

  142.   if(( sendbytes = send(sockfd, bmpdata ,bmpsize, 0)) == -1){
  143.                 perror("send");
  144.                 exit(1);
  145.     }


  146.     for( i = 0  ; i< MAXDATASIZE ; i++ )
  147.          {   
  148.            printf("%x - ",bmpdata[i] ) ;
  149.          }
  150.          
  151.   printf("send over!\n");
  152.   
  153.   fclose(fbmp);
  154. close(sockfd);

  155. }

复制代码

论坛徽章:
0
2 [报告]
发表于 2007-11-19 21:54 |只看该作者
#define MAXDATASIZE 100*100*3+54

我传的是一个确定大小的BMP

论坛徽章:
0
3 [报告]
发表于 2007-11-20 09:24 |只看该作者
是不是该作为二进制文件打开读写?

论坛徽章:
0
4 [报告]
发表于 2007-11-20 09:47 |只看该作者
可能是recv接收到的字节数不正确,你可以尝试修改一下这段代码

  1. if(( recvbytes = recv(client_fd, bmpdata, MAXDATASIZE, 0)) == -1){
  2.                 perror("recv");
  3.                 exit(1);
  4.         }
复制代码

判断一下recvbytes 的大小。

论坛徽章:
0
5 [报告]
发表于 2007-11-20 11:58 |只看该作者
你试着用二进制格式打开或读写文件试试看。

论坛徽章:
0
6 [报告]
发表于 2007-11-20 21:31 |只看该作者
感谢论坛朋友们的建议
根据大家的建议
我分别用了 recv(client_fd, bmpdata, MAXDATASIZE, MSG_WAITALL) 和循环的方法来做

但是结果还是不很理想

一.用  recv(client_fd, bmpdata, MAXDATASIZE, MSG_WAITALL) 来解决
  现在想把 800*800 以下的任意 BMP传过去, 用以下的代码,试验了很多BMP 图片,也发现了几个有意思的现


  1.如果位图大小大于 1MB 的时候,server.bmp 最后的填充大小为 0k ,recv,send的返回值都比位图本身大

小要小
   例如: 位图大小为 1418486 bytes,而 send 返回值为 712416,recv返回值为 641078.

  2.如果位图大小约为 800k 的时候,server.bmp 最后的填充大小为 client.bmp原始大小,但是位图只能显示

一大部分,剩余部分全为黑色    (0x00),recv,send的返回值都比位图本身大小要小
   例如: 位图大小为 814502 bytes,而 send 返回值为 705176,recv返回值为 641078.

   奇怪:recv 返回都为 641078 bytes

   如果位图大小为 600K 以下的话,就可以完全正确显示。百思不得其解

  1. -------client-----------

  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <errno.h>
  7. #include <string.h>
  8. #include <unistd.h>
  9. #include <netinet/in.h>
  10. #include <netdb.h>

  11. #define SERVPORT 3333

  12. #define MAXDATASIZE 800*800+1024


  13. main( int argc , char *argv[] )
  14. {
  15.          struct hostent *host;
  16.    struct sockaddr_in serv_addr;
  17.          int sockfd,sendbytes;
  18.          char buf[MAXDATASIZE];
  19.          int bmpsize = 0,
  20.              i,
  21.              headersize = 0,
  22.              pixelsize = 0;
  23.          
  24.          FILE *fbmp;
  25.          char bmpdata[MAXDATASIZE];
  26.          
  27. if (( fbmp = fopen("client.bmp", "r")) == NULL)
  28.          {
  29.            printf("Open client bmp error !\n");
  30.            exit(-1);
  31.            }


  32.   fseek(fbmp,10,SEEK_SET);
  33.   fread(&headersize,4,1,fbmp);
  34.   printf("This BMP's headersize = %d \n" , headersize);
  35.   
  36.   fseek(fbmp,34,SEEK_SET);
  37.   fread(&pixelsize,4,1,fbmp);
  38.   printf("This BMP's pixelsize = %d \n" , pixelsize);   
  39.   
  40.   bmpsize = headersize + pixelsize ;

  41.   printf("This BMP's  bmpsize = %d \n" , bmpsize);   
  42.   

  43.   fseek(fbmp,0,SEEK_SET);
  44.   fread(bmpdata,MAXDATASIZE,1,fbmp);
  45.   
  46.   
  47. if( argc < 2) {
  48.          fprintf(stderr, "Please enter the server's hostname!\n");
  49.            exit(1);
  50.     }
  51.    
  52. if( (host = gethostbyname(argv[1])) == NULL ){
  53.               perror("gethostbyname");
  54.               exit(1);          
  55.    }
  56.          
  57.   if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
  58.                    perror("socket");
  59.                    exit(1);
  60.          }

  61.    printf("socket success!,socket = %d\n",sockfd);
  62.    
  63.    serv_addr.sin_family = AF_INET;         
  64.    serv_addr.sin_port = htons(SERVPORT);                 
  65.    serv_addr.sin_addr = *( (struct in_addr *)host->h_addr );
  66.    
  67.    bzero(&(serv_addr.sin_zero), 8);
  68.    
  69.    if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1 ){
  70.        perror("connect");
  71.        exit(1);           
  72.           }                 
  73.          
  74.          printf("connect success!\n");         

  75.   if(( sendbytes = send(sockfd, bmpdata ,bmpsize, 0)) == -1){
  76.                 perror("send");
  77.                 exit(1);
  78.         }
  79.           printf("sent connection :%d\n", sendbytes );

  80.          
  81.   printf("send over!\n");
  82.   
  83.   fclose(fbmp);
  84.   close(sockfd);

  85. }

  86. --------------------server-----------------------

  87. #include <sys/types.h>
  88. #include <sys/socket.h>
  89. #include <stdio.h>
  90. #include <stdlib.h>
  91. #include <errno.h>
  92. #include <string.h>
  93. #include <unistd.h>
  94. #include <netinet/in.h>

  95. #define SERVPORT 3333
  96. #define BACKLOG 10
  97. #define MAX_CONNECTED_NO 10

  98. #define MAXDATASIZE 800*800+1078



  99. int main()
  100. {
  101.          struct sockaddr_in  server_sockaddr,client_sockaddr;
  102.          int sin_size,recvbytes;
  103.          int sockfd,client_fd;
  104.          char buf[MAXDATASIZE];
  105.          int nwrite,i;
  106.          int headersize,pixelsize,bmpsize;
  107.        
  108.          FILE *fbmp;
  109.          char bmpdata[MAXDATASIZE];       
  110.        
  111. if (( fbmp = fopen("server.bmp", "w+")) == NULL)
  112.           {
  113.                    printf("Open  server bmp error !\n");
  114.                    exit(-1);
  115.             }

  116.          
  117. if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
  118.                    perror("socket");
  119.                    exit(1);
  120.          }

  121.    printf("socket success!,sockfd = %d\n",sockfd);
  122.    
  123.    server_sockaddr.sin_family = AF_INET;         
  124.    server_sockaddr.sin_port = htons(SERVPORT);                 
  125.    server_sockaddr.sin_addr.s_addr = INADDR_ANY;
  126.    
  127.    bzero(&(server_sockaddr.sin_zero), 8);
  128.    
  129.    if(bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr)) == -1 ){
  130.        perror("bind");
  131.        exit(1);           
  132.           }
  133.          
  134.          printf("bind success!\n");
  135.          
  136.          
  137.          
  138.    if(listen(sockfd, BACKLOG) == -1){
  139.                    perror("listen");
  140.                    exit(1);                  
  141.          }
  142.          
  143.          printf("listening - - - \n");
  144.          
  145.   if( (client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1 ){
  146.                     perror("accept");
  147.                     exit(1);
  148.   }
  149.        

  150.   if(( recvbytes = recv(client_fd, bmpdata, MAXDATASIZE, MSG_WAITALL)) == -1){
  151.                 perror("recv");
  152.                 exit(1);
  153.         }
  154.          
  155.          
  156.          
  157.           printf("received a connection :%d\n", recvbytes );



  158.   headersize =((bmpdata[13] & 0x000000ff) *256*256*256 ) + ((bmpdata[12] & 0x000000ff) *256*256 )

  159. \
  160.               + ( (bmpdata[11] & 0x000000ff) *256 ) + (bmpdata[10] & 0x000000ff) *1 ;

  161.   
  162.   pixelsize =((bmpdata[37] & 0x000000ff) *256*256*256 ) + ((bmpdata[36] & 0x000000ff) *256*256 ) +

  163. \
  164.               ( (bmpdata[35] & 0x000000ff) *256 ) + (bmpdata[34] & 0x000000ff) *1 ;
  165.   

  166.   bmpsize = headersize + pixelsize;         



  167. if ( nwrite = fwrite (bmpdata, bmpsize,1, fbmp  ) < 0)
  168.              {
  169.                      printf("Write  BMP error !\n");
  170.                     exit(-1);
  171.       }

  172.   fclose(fbmp);
  173.   close(sockfd);

  174. }

复制代码

论坛徽章:
0
7 [报告]
发表于 2007-11-20 21:32 |只看该作者
二.用 循环的方法来解决

  1.如果位图大小大于 1MB 的时候,server.bmp 最后的填充大小为 1k ,且填充的值全为0x00,send的返回值都比位图本身大小要小
   例如: 位图大小为 1418486 bytes,而 send 返回值为 14480,recv循环返回值为 1.

  2.如果位图大小约为 800k 的时候,server.bmp 最后的填充大小为 1K. 且填充的值全为0x00,send的返回值比位图本身大小要小
   例如: 位图大小为 762054 bytes,而 send 返回值为 50680 ,recv循环返回值为 1.

   如果位图大小为 600K 以下的话,就可以完全正确显示。

  1. --------client----------------

  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <errno.h>
  7. #include <string.h>
  8. #include <unistd.h>
  9. #include <netinet/in.h>
  10. #include <netdb.h>

  11. #define SERVPORT 3333

  12. #define MAXDATASIZE 512*512+1024+54



  13. main( int argc , char *argv[] )
  14. {
  15.          struct hostent *host;
  16.    struct sockaddr_in serv_addr;
  17.          int sockfd,sendbytes;
  18.          char buf[MAXDATASIZE];
  19.          char size[4];
  20.          int bmpsize = 0,
  21.              i,
  22.              headersize = 0,
  23.              pixelsize = 0,
  24.              vector = 0,
  25.              palette = 0;
  26.          char bmpsizechar;
  27.          
  28.          FILE *fbmp;
  29.          char bmpdata[MAXDATASIZE];
  30.          
  31. if (( fbmp = fopen("client.bmp", "r")) == NULL)
  32.                    {
  33.                    printf("Open client bmp error !\n");
  34.                    exit(-1);
  35.             }


  36.   fseek(fbmp,10,SEEK_SET);
  37.   fread(&headersize,4,1,fbmp);
  38.   printf("This BMP's headersize = %d \n" , headersize);  // 为 54 和1078
  39.   
  40.   fseek(fbmp,34,SEEK_SET);
  41.   fread(&pixelsize,4,1,fbmp);
  42.   printf("This BMP's pixelsize = %d \n" , pixelsize);   


  43.   fseek(fbmp,28,SEEK_SET);
  44.   fread(&vector,2,1,fbmp);
  45.   printf("This BMP's vector = %d \n" , vector);
  46.   
  47.   if(vector == 24 || vector == 18)         
  48.         bmpsize = 54 + pixelsize ;
  49.   else
  50.         bmpsize = 1078 + pixelsize ;  
  51.         
  52.   
  53.   printf("This BMP's  bmpsize = %d \n" , bmpsize);   

  54.   fseek(fbmp,0,SEEK_SET);
  55.   fread(bmpdata,bmpsize,1,fbmp);

  56.   if( argc < 2) {
  57.           fprintf(stderr, "Please enter the server's hostname!\n");
  58.            exit(1);
  59.     }
  60.    
  61. if( (host = gethostbyname(argv[1])) == NULL ){
  62.               perror("gethostbyname");
  63.               exit(1);          
  64.    }
  65.          
  66.   if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
  67.                    perror("socket");
  68.                    exit(1);
  69.          }

  70.    printf("socket success!,socket = %d\n",sockfd);
  71.    
  72.    serv_addr.sin_family = AF_INET;         
  73.    serv_addr.sin_port = htons(SERVPORT);                 
  74.    serv_addr.sin_addr = *( (struct in_addr *)host->h_addr );
  75.    
  76.    bzero(&(serv_addr.sin_zero), 8);
  77.    
  78.    if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1 ){
  79.        perror("connect");
  80.        exit(1);           
  81.           }                 
  82.          
  83.          printf("connect success!\n");
  84.        

  85.   if(( sendbytes = send(sockfd, bmpdata ,bmpsize, 0)) == -1){
  86.                 perror("send");
  87.                 exit(1);
  88.         }
  89.        
  90.    printf("sent connection :%d\n", sendbytes );


  91.          
  92.   printf("send over!\n");
  93.   
  94.   fclose(fbmp);
  95.   close(sockfd);

  96. }

  97. -----------------------------server--------------------

  98. #include <sys/types.h>
  99. #include <sys/socket.h>
  100. #include <stdio.h>
  101. #include <stdlib.h>
  102. #include <errno.h>
  103. #include <string.h>
  104. #include <unistd.h>
  105. #include <netinet/in.h>

  106. #define SERVPORT 3333
  107. #define BACKLOG 10
  108. #define MAX_CONNECTED_NO 10
  109. //#define MAXDATASIZE 800*800+1024+54



  110. int main()
  111. {
  112.          struct sockaddr_in  server_sockaddr,client_sockaddr;
  113.          int sin_size,recvbytes;
  114.          int sockfd,client_fd;
  115.          int nwrite,i;

  116.    char size[4];

  117.    volatile int bmpsize = 800*800;

  118.    int pixelsize,vector;
  119.        
  120.          FILE *fbmp;
  121.          char bmpdata[MAXDATASIZE];       
  122.          char *p;
  123.        

  124.          
  125.   if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
  126.                    perror("socket");
  127.                    exit(1);
  128.          }

  129.    printf("socket success!,sockfd = %d\n",sockfd);
  130.    
  131.    server_sockaddr.sin_family = AF_INET;         
  132.    server_sockaddr.sin_port = htons(SERVPORT);                 
  133.    server_sockaddr.sin_addr.s_addr = INADDR_ANY;
  134.    
  135.    bzero(&(server_sockaddr.sin_zero), 8);
  136.    
  137. if(bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr)) == -1 ){
  138.        perror("bind");
  139.        exit(1);           
  140.           }                 
  141.          
  142.      printf("bind success!\n");

  143.          
  144. if(listen(sockfd, BACKLOG) == -1){
  145.                    perror("listen");
  146.                    exit(1);                  
  147.          }
  148.          
  149.          printf("listening - - - \n");
  150.          
  151. if( (client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1 ){
  152.                     perror("accept");
  153.                     exit(1);
  154.    }
  155.        
  156.                  printf("accept is ok ! \n");

  157.         i = 0;
  158.        
  159. while(1){
  160.        
  161.         if(( recvbytes = recv(client_fd, &bmpdata[i], 1, 0)) == -1){
  162.                 perror("recv");
  163.                 exit(1);
  164.           }
  165.   
  166.         if(i ==54){

  167.           pixelsize = ((bmpdata[37] & 0x000000ff) *256*256*256 ) + ((bmpdata[36] & 0x000000ff) *256*256 ) \
  168.                      + ( (bmpdata[35] & 0x000000ff) *256 ) + (bmpdata[34] & 0x000000ff) *1 ;
  169.           vector =( bmpdata[28] & 0x000000ff) *1 ;
  170.            
  171.           if(vector == 24 || vector == 18)         
  172.                   bmpsize = 54 + pixelsize ;
  173.           else
  174.                     bmpsize = 1078 + pixelsize ;  
  175.                         
  176.           printf("pixelnumber = %d\n",pixelsize);                       
  177.           printf("size is change for = %d\n",bmpsize);
  178.         }
  179.        
  180.      
  181.           i++;
  182.          
  183.           if( i == bmpsize)
  184.                  break;
  185.          
  186. }         


  187.         printf("receiving bytes' number is  :%d\n", i);
  188.           printf("received a connection :%d\n", recvbytes );

  189. if (( fbmp = fopen("server.bmp", "w+")) == NULL)
  190.            {
  191.                    printf("Open  server bmp error !\n");
  192.                    exit(-1);
  193.             }  


  194. if ( nwrite = fwrite (bmpdata, bmpsize,1, fbmp ) < 0)
  195.              {
  196.                      printf("Write  BMP error !\n");
  197.                     exit(-1);
  198.       }

  199.   fclose(fbmp);
  200.   close(sockfd);

  201. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2007-11-21 09:17 |只看该作者
建议研究一下你平台下的recv/send机制

论坛徽章:
0
9 [报告]
发表于 2007-11-21 22:54 |只看该作者
如果用循环来做的话,那根据大小N   , 一次只send 和recv 一个 byte吗???


其实我还有一个疑问:

在我的代码中,没有把socket设置成non-block模式, 为什么send()还没发送完, 就能返回???

论坛徽章:
0
10 [报告]
发表于 2007-11-22 13:44 |只看该作者
根据大家的建议,用循环的思路来做
发送端--》发送4个字节表示文件长度,  然后循环调用send,直到发送字节数为N;
接收端-》接收4个字节,知道长度后,循环调用recv,直到收到字节数为N;(recv后,每次追加方式写入文件)

但是又有新的问题出现了,出现的问题标注在代码中,我把出现问题的那部分代码贴上,请大家分析一下



  1. ---------------------------client-----------------------
  2. if(( sendbytes = send(sockfd, size ,4, 0)) == -1){
  3.         perror("send");
  4.         exit(1);
  5.    }
  6. printf("sent connection1 =  :%d\n", sendbytes );  //int bmpsize --> char size[4], 此处发送正确,bmpsize = 814502

  7.   
  8. for( i = 0; i< bmpsize ;i++){       
  9.                      
  10.     if(( sendbytes = send(sockfd, &bmpdata[i] ,1, 0)) == -1){
  11.                    perror("send");
  12.                    exit(1);
  13.             }        
  14.            }  // 在client 运行的时候,程序会在此停留很久。然后打印:send: Bad address就退出了   

  15. printf("sent connection2 = :%d\n", sendbytes );

  16. ---------------------------server--------------------------

  17.    bmpdata[0]=0xff;
  18.    bmpdata[1]=0xff;  //初始化


  19. if(( recvbytes = recv(client_fd, size, 4, 0)) == -1){
  20.         perror("recv");
  21.         exit(1);
  22.    }
  23.           
  24. bmpsize = ((size[3] & 0x000000ff) *256*256*256 ) + ((size[2] & 0x000000ff) *256*256 ) \
  25.            + ( (size[1] & 0x000000ff) *256 ) + (size[0] & 0x000000ff) *1 ;
  26.        
  27. printf(" bmpsize  is  :%d\n", bmpsize); //此处接收正确,也为client端发送的值,bmpsize = 814502


  28. i = 0;
  29.        
  30. while(1){
  31.        
  32.    if(( recvbytes = recv(client_fd, &bmpdata[i], 1, 0)) == -1){
  33.         perror("recv");
  34.         exit(1);
  35.     }
  36.       
  37.    if(i < 16)
  38.              printf("bmpdata[%d] = %d\n",i ,bmpdata[i]); //此处打印的值不为初始化值,全为0,看来在接收,但接收不正确
  39.      
  40.    i++;
  41.          
  42.    if( i == bmpsize)     //程序在这个循环中停留很久,直到client端出现错误后,才往下执行。
  43.          break;
  44.          
  45. }         
  46.    // 接收的数据全为0
  47.    printf("receiving bytes' number is  :%d\n", i);
  48.    printf("received a connection :%d\n", recvbytes );

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP