LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1490|回复: 13

关于socket 传送文件的问题 [困惑]

[复制链接]
发表于 2007-11-19 21:44:56 | 显示全部楼层 |阅读模式
关于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. }

复制代码
 楼主| 发表于 2007-11-19 21:46:19 | 显示全部楼层
#define MAXDATASIZE 100*100*3+54

我传的是一个确定大小的BMP
回复 支持 反对

使用道具 举报

发表于 2007-11-19 23:13:05 | 显示全部楼层
呵呵, 你怎么知道 send() 一次调用就能把你的数据全部发送完呢? 正确的做法是根据 send() 的返回值判断还有多少数据未发送, 然后继续调用 send() 发送剩余的部分, 直至全部发送完毕.

recv() 也存在同样的问题.
回复 支持 反对

使用道具 举报

发表于 2007-11-19 23:18:48 | 显示全部楼层
应该是图片没传完吧
看看 sendbytes recvbytes 值是多少
回复 支持 反对

使用道具 举报

发表于 2007-11-19 23:18:55 | 显示全部楼层
而且 1448 应该正是一个以太网包能容纳的用户数据长度.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-20 21:33:17 | 显示全部楼层
感谢论坛朋友们的建议
根据大家的建议
我分别用了 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. }

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-20 21:34:00 | 显示全部楼层
二.用 循环的方法来解决

  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. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-11-20 22:03:19 | 显示全部楼层
奇怪, 你没有把socket设置成non-block模式, 为什么send()还没发送完, 就能返回.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-21 22:55:29 | 显示全部楼层
是的,为什么 send  在没有任何错误的情况就退出了?

还有,如果用循环来做的话,那根据大小N   , 一次只send 和recv 一个 byte吗???
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-21 22:56:14 | 显示全部楼层
发送端--》发送4个字节表示文件长度,  然后循环调用send,直到发送字节数为N;
接收端-》接收4个字节,知道长度后,循环调用recv,直到收到字节数为N;(recv后,每次追加方式写入文件)

用循环来做的话,那根据大小N , 一次只send 和recv 一个 byte吗???
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表