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

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

用到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;

其实最重要的是buffer。只要buffer打印的是传送过来的内容,并且没有错的话。那就可以通过这个buffer做很多东西了。我们可以在buffer里面装上一个协议,当协议为1的时候就上传内容,当协议为2的时候下载内容。然后文本内容也是在buffer里面一起传送过来就行。然后再见到地保存到服务器所在的本地文件。

客户端

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); 
        } 

buffer里面送了协议指令,也就是刚刚说的:当协议为1的时候就上传内容,当协议为2的时候下载内容。然后再加上文件内容就行。注意,这里面下载内容还需要加上接受服务器的信息,也就是当服务器把文件传送回来的时候,能够保存在客户端的本地。

其实完整的网络传输用到了socket,整个框架也不算太难。有需要深入探究的,可以关注公众号:诗一样的代码。和我一起探讨吧。

相关文章
|
2月前
|
存储 分布式数据库 API
技术好文:VisualC++查看文件被哪个进程占用
技术好文:VisualC++查看文件被哪个进程占用
|
2月前
|
缓存 网络协议 Linux
c++实战篇(三) ——对socket通讯服务端与客户端的封装
c++实战篇(三) ——对socket通讯服务端与客户端的封装
|
9天前
|
存储 算法 C++
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
|
10天前
|
存储 数据挖掘 C语言
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
|
4天前
|
安全 C++ Windows
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
Windows下C++使用gRPC(Qt和VS,含文件包和使用方法)
|
6天前
|
C++
C++通过文件指针获取文件大小
C++通过文件指针获取文件大小
|
2月前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
28 0
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
2月前
|
C++ iOS开发 开发者
C++一分钟之-文件输入输出(I/O)操作
【6月更文挑战第24天】C++的文件I/O涉及`ifstream`, `ofstream`和`fstream`类,用于读写操作。常见问题包括未检查文件打开状态、忘记关闭文件、写入模式覆盖文件及字符编码不匹配。避免这些问题的方法有:检查`is_open()`、显式关闭文件或使用RAII、选择适当打开模式(如追加`ios::app`)以及处理字符编码。示例代码展示了读文件和追加写入文件的实践。理解这些要点能帮助编写更健壮的代码。
41 2
|
2月前
|
移动开发 Java
Java Socket编程 - 基于Socket实现HTTP下载客户端
Java Socket编程 - 基于Socket实现HTTP下载客户端
26 1
|
2月前
|
IDE 开发工具 C++
插件:CLion中使用C/C++ Single File Execution插件编译和运行单个文件
插件:CLion中使用C/C++ Single File Execution插件编译和运行单个文件
59 0

热门文章

最新文章