閒暇時寫的一個基於SOCKET的文件傳輸程序

//Server----Receive
#include <cstdlib> 
#include <iostream> 
#include "CSocket.h" 
#define SIZE (1024*1024) 

struct pack_head 
{   
    int nfileSize; 
    char szfileName[32];     
}; 

int main(int argc, char *argv[]) 
{ 
    CSocket::InitLib(); 
    CSocket sock, trsock; 
    sock.InitSock(); 
    sock.Bind(); 
    sock.Listen();
     
Redo:      
    printf("Now wait for connection........\n"); 
    sock.Accept(trsock); 
    printf("Connected now........\n"); 
    
    pack_head strupk; 
    memset(&strupk, 0, sizeof(pack_head)); 
    trsock.Recv((char*)&strupk, sizeof(pack_head)); 
    printf("%s\n%d\n", strupk.szfileName, strupk.nfileSize); 
    assert(strupk.nfileSize > 0); 
    char path[32] = "E:\\"; strcat(path, strupk.szfileName); 
    
    FILE *fp = fopen(path, "wb"); 
    assert(fp != NULL); 
    
    int FileSize = strupk.nfileSize; 
    int nXiabiao = 0; 
    int nBytesRecvd = 0;
    char *pBuff = (char*)malloc(SIZE); 
    memset(pBuff, 0, SIZE);     
    printf("Receiving...................................");
    
    while (nBytesRecvd < FileSize) 
    { 
         int k = trsock.Recv(pBuff+nXiabiao, SIZE); 
         
         if (k <= 0) 
         { 
              trsock.Close();
              fclose(fp);
              goto Redo;
         } 
         
         nXiabiao += k; 
         nBytesRecvd += k;
         
         int i = int(((double)nBytesRecvd/FileSize)*100);
         printf("%d%%", i);
         if (i <= 9)
              printf("\b\b");
         else if (i != 100)
              printf("\b\b\b");
         else
              printf("\n");
                    
         if (nXiabiao == SIZE || nBytesRecvd == FileSize) 
         { 
              fflush(fp);
              fwrite(pBuff, 1, nXiabiao, fp);   
              memset(pBuff, 0, SIZE); 
              nXiabiao = 0;               
         } 
    }   
    
    fclose(fp);
    free(pBuff);
    system("PAUSE"); 
    return EXIT_SUCCESS; 
}




//Client------Send  
#include <cstdlib>  
#include <iostream>  
#include "CSocket.h"  
#define SIZE (1024*1024)   
  
struct pack_head   
{     
    int nfileSize;   
    char szfileName[32];       
};   
       
int main(int argc, char *argv[])  
{  
    CSocket::InitLib();  
    CSocket c;  
    c.InitSock();  
      
    while (c.Connect() == FALSE)  
    {  
        Sleep(1000*2);;              
    }  
      
    printf("Connected !\n");  
      
    char fpath[128] = "";  
    char fname[20] = "";  
  
    printf("Input file path:");        
    gets(fpath);  
    printf("Input file name:");  
    gets(fname);  
      
    FILE* fp = fopen(fpath, "rb");     
    assert(fp != NULL);     
      
    fseek(fp, 0, SEEK_END);  
    int filesize = ftell(fp);  
    fseek(fp, 0, SEEK_SET);  
      
    printf("filesize:\t%d\n", filesize);  
      
    pack_head s;   
    memset(&s, 0, sizeof(pack_head));  
    memcpy(s.szfileName, fname, sizeof(fname));  
    s.nfileSize = filesize;  
      
    c.Send((char*)&s, sizeof(s));   
    char *pBuff = (char*)malloc(SIZE);   
    memset(pBuff, 0, SIZE);   
    int nBytesSend = 0;  
    printf("Sending...................................");  
      
    while(!feof(fp))  
    {                   
         int read = fread(pBuff, 1, SIZE, fp);   
         {  
             int k = c.Send(pBuff, read);  
             if (k <= 0)  
             {  
                 c.Close();  
                 fclose(fp);  
                 break;  
             }   
             else  
             {      
                 nBytesSend += k;   
                 int i = int(((double)nBytesSend/filesize)*100);  
                 printf("%d%%", i);  
                 if (i <= 9)  
                     printf("\b\b");  
                 else if (i != 100)  
                     printf("\b\b\b");  
                 else  
                     printf("\n");  
             }      
                               
         }  
         memset(pBuff, 0, SIZE);  
         Sleep(10);            
    }          
    
    fclose(fp);  
    free(pBuff);  
    system("PAUSE");  
    return EXIT_SUCCESS;  

}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值