c++用socket,ftp进行文件传输,实现上传与下载文件功能

c++用socket,ftp进行文件传输,实现上传与下载文件功能

c++用socket,ftp进行文件传输,实现上传与下载文件功能

用到socket,需要分为服务器端和客户端。

服务器端

1 声明并初始化一个服务端(本地)的地址结构

 
  sockaddr_in server_addr; 
  server_addr.sin_family = AF_INET; 
  server_addr.sin_addr.S_un.S_addr = INADDR_ANY; 
  server_addr.sin_port = htons(PORT); 

//2 初始化socket


  WSADATA wsaData; 
  WORD socketVersion = MAKEWORD(2, 0); 
  if(WSAStartup(socketVersion, &wsaData) != 0) 
  {
    
    printf("Init socket dll error!"); 
    exit(1); 
  } 

3创建socket

// 创建socket 
  SOCKET m_Socket = socket(AF_INET, SOCK_STREAM, 0); 
    if (SOCKET_ERROR == m_Socket) 
    {
    
      printf("Create Socket Error!"); 
    exit(1); 
    } 

4绑定监听

//监听 
  if (SOCKET_ERROR == listen(m_Socket, 10)) 
  {
    
    printf("Server Listen Failed: %d", WSAGetLastError()); 
    exit(1); 
  } 

5读取信息,判断客户端是需要读文件还是下载文件

	char buffer[BUFFER_SIZE]; 
	memset(buffer, 0, BUFFER_SIZE); 
    if (recv(m_New_Socket, buffer, BUFFER_SIZE, 0) < 0) 
    {
    
      printf("Client Receive Data Failed!"); 
      break; 
    } 
	
	std::cout<<buffer<<endl;

客户端

1初始化socket

// 初始化socket dll 
  WSADATA wsaData; 
  WORD socketVersion = MAKEWORD(2, 0); 
  if(WSAStartup(socketVersion, &wsaData) != 0) 
  {
    
    printf("Init socket dll error!"); 
    exit(1); 
  } 

2创建socket,指定服务器

//创建socket 
	  SOCKET c_Socket = socket(AF_INET, SOCK_STREAM, 0); 
	  if (SOCKET_ERROR == c_Socket) 
	  {
    
		  printf("Create Socket Error!"); 
		  system("pause"); 
		  exit(1); 
	  } 
 
	  //指定服务端的地址 
	  sockaddr_in server_addr; 
	  server_addr.sin_family = AF_INET; 
	  server_addr.sin_addr.S_un.S_addr = inet_addr(SERVER_IP); 
	  server_addr.sin_port = htons(PORT); 

3连接服务器

if (SOCKET_ERROR == connect(c_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr))) 
	  {
    
		  printf("Can Not Connect To Client IP!\n"); 
		  system("pause"); 
		  exit(1); 
	  } 

4向服务器请求指令,是上传,还是下载。

		if(send(c_Socket, buffer, BUFFER_SIZE, 0) < 0) 
		{
    
			  printf("Send File Name Failed\n"); 
			  system("pause"); 
			  exit(1); 
		} 

然后上传和下载过程就和本地的文件读写内容差不多。

有需要源码的小伙伴可以联系我。也欢迎其他小伙伴留言交流学习
q:2316773638

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2868.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Json 作为ActionResutl 时出错

    Json 作为ActionResutl 时出错

    2021年8月23日
    66
  • KindEditor富文本编辑器 items配置项 对照表「建议收藏」

    KindEditor富文本编辑器 items配置项 对照表「建议收藏」source:’HTML代码’, undo:’后退(Ctrl+Z)’, redo:’前进(Ctrl+Y)’, cut:’剪切(Ctrl+X)’, copy:’复制(Ctrl+C)’, paste:’粘贴(Ctrl+V)’, plainpaste:’粘贴为无格式文本’, wordpaste:’从Word粘贴’, selectall:

    2022年8月31日
    5
  • linux内存管理之 ION 内存管理器浅析Ⅱ(system contig heap)

    linux内存管理之 ION 内存管理器浅析Ⅱ(system contig heap)目录1systemcontigheap与systemheap2systemcontigheap创建3systemcontigheap内存分配4systemcontigheap内存释放1systemcontigheap与systemheap从代码中我们看到systemcontigheap与systemheap同属一个文件中,ion_system_heap.c相同点:它们都是根据用户传递的字节len,转换成order,从buddy中

    2025年8月13日
    2
  • 闫学灿acwing_用标号法求网络最大流

    闫学灿acwing_用标号法求网络最大流给定一个包含 n 个点 m 条边的有向图,并给定每条边的容量,边的容量非负。图中可能存在重边和自环。求从点 S 到点 T 的最大流。输入格式第一行包含四个整数 n,m,S,T。接下来 m 行,每行三个整数 u,v,c,表示从点 u 到点 v 存在一条有向边,容量为 c。点的编号从 1 到 n。输出格式输出点 S 到点 T 的最大流。如果从点 S 无法到达点 T 则输出 0。数据范围2≤n≤1000,1≤m≤10000,0≤c≤10000,S≠T输入样例:7 14 1 71 2

    2022年8月10日
    12
  • rabbitMQ与activeMQ区别

    rabbitMQ与activeMQ区别rabbitMQ 与 activeMQ 区别之前的项目中都用到了这两个消息队列 因此总结一下它们的不同之处 做一个笔记 下次需要的时候再行参考 概念为什么使用消息队列六个字 异步 解耦 削峰 使用了消息队列会有什么缺点一个使用了 MQ 的项目 如果连这个问题都没有考虑过 就把 MQ 引进去了 那就给自己的项目带来了风险 我们引入一个技术 要对这个技术的弊端有充分的认识 才能做好预防 要记住 不要给公司挖坑 从以下两个个角度来考虑 系统可用性降低 你想啊 本来其他系统只要运行好好的 那你的系统就是正常的 现

    2025年7月8日
    5
  • 用户地理位置的聚类算法实现—基于DBSCAN和Kmeans的混合算法

    用户地理位置的聚类算法实现—基于DBSCAN和Kmeans的混合算法用户地理位置的聚类算法实现—基于DBSCAN和Kmeans的混合算法用户地理位置的聚类算法实现基于DBSCAN和Kmeans的混合算法聚类算法简介1基于划分的Kmeans算法2基于密度的DBSCAN算法用户地理位置信息的的聚类实现1基于Kmeans的聚类实现2基于DBSCAN的聚类实现基于DBSCAN和Kmeans的混合算法实现1.聚类算法简介聚类的目标是使同一类对象

    2022年6月18日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号