写了一个文件传输软件

大家好,我是涛哥。

最近遇到这样一件事情,有一个大文件,用微信从电脑A传输到电脑B,结果微信提示文件过大。这点小事情,略微有点郁闷。

解决办法肯定是有的,比如下载一个文件传输软件,然后传送大文件。不过,我也懒得下载了,自己直接写一个传输软件吧。

接下来,我会基于tcp网络编程,实现文件传输的服务端和客户端,最终完成文件传输。为便于结果演示,我用环回地址测试。

ftp服务端实现

我们来看看服务端的思路,首先服务端要知道传输文件的大小,然后循环接收文件就行,实际程序如下,在关键地方都有详细注释:


#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
 
int main()
{
  // tcp连接部分
  WORD wVersionRequested;
  WSADATA wsaData;
  wVersionRequested = MAKEWORD(1, 1);
  WSAStartup( wVersionRequested, &wsaData );
 
  unsigned int sockSrv = socket(AF_INET, SOCK_STREAM, 0);
  SOCKADDR_IN addrSrv;
 
  addrSrv.sin_family = AF_INET; 
  addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 
  addrSrv.sin_port = htons(8888); 
 
  bind(sockSrv,(SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
 
  listen(sockSrv, 5);
 
  SOCKADDR_IN addrClient;
  int len = sizeof(SOCKADDR);
  unsigned int sockConn = accept(sockSrv,(SOCKADDR*)&addrClient, &len);
 
  // 接收ftp client发送过来的文件长度 
  char sizeFileStr[20] = {0};
  recv(sockConn, sizeFileStr, sizeof(sizeFileStr) - 1, 0);
  int fileSize = atoi(sizeFileStr);
 
  // 接收ftp client发送的文件并保存
  char recvBuf[1024] = {0};  
  int recvTotalSize = 0;
  FILE *fp = fopen("server.rar", "wb");
  while(recvTotalSize < fileSize)
  {
    int recvSize = recv(sockConn, recvBuf, sizeof(recvBuf), 0);
    recvTotalSize += recvSize;
    printf("received %f MB\n", recvTotalSize/(1024.0 * 1024.0));
    fwrite(recvBuf, 1, recvSize, fp);
  }
  fclose(fp);
 
  if(recvTotalSize == fileSize)
  {
    printf("Done!");
  }
  else
  {
    printf("Error!");
  }
  
  closesocket(sockSrv);
  WSACleanup();
 
  getchar();
  
  return 0;
}

编译并运行程序,开启服务端,等待客户端的连接,等待文件传输。

ftp客户端实现

客户端的思路也很直接,首先要计算出待传文件的大小,然后循环地读取文件并传输,具体代码如下:


#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
 
int main()
{
  // tcp连接部分
  WORD wVersionRequested;
  WSADATA wsaData;
  wVersionRequested = MAKEWORD(1, 1);
  
  WSAStartup( wVersionRequested, &wsaData );
 
  SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
 
  SOCKADDR_IN addrSrv;
  addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  addrSrv.sin_family = AF_INET;
  addrSrv.sin_port = htons(8888);
  connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
 
  // ftp client读取文件长度
  FILE *fp = fopen("MVC++6.0.rar", "rb");
  fseek( fp, 0, SEEK_END );
  int totalSize =  ftell(fp);
  fclose(fp);
 
  // ftp client发送文件长度
  char fileSizeStr[20] = {0};
  itoa(totalSize, fileSizeStr, 10);
  send(sockClient, fileSizeStr, strlen(fileSizeStr) + 1, 0);
 
  // ftp client发送文件
  fp = fopen("MVC++6.0.rar", "rb");
  int  readSize = 0;
  int  sendTotalSize = 0;
  char sendBuf[1024] = {0};
  while((readSize = fread(sendBuf, 1, sizeof(sendBuf), fp)) > 0)
  {
    send(sockClient, sendBuf, readSize, 0); 
    sendTotalSize += readSize;
 
    printf("sent %f MB\n", sendTotalSize/(1024.0 * 1024.0));
  }
  fclose(fp);
 
  if(sendTotalSize == totalSize)
  {
    printf("Done!");
  }
  else
  {
    printf("Error!");
  }
 
  closesocket(sockClient);
  WSACleanup();
 
  getchar();
 
  return 0;
}

编译客户端程序,把待传文件放在对应目录下,然后开启客户端,开始上传文件。

文件传输的结果

由上述程序,完成了文件的传输。本文很简单,建议有兴趣的同学实际玩一下本文的例子,感受一下文件传输的过程,网络编程要多动手实践。希望大家有所收获。

本文是由实际问题引起的,进而想出解决方法。大家每天都会遇到问题,不要烦恼,要以解决问题为乐,兵来将挡,水来土掩,要相信问题一定有解决方法。加油。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值