参考:http://www.jb51.net/article/53732.htm

本博客主要实现了简单win7系统下,两台电脑之间(客户机与服务器)的文件传输,主要是基于Windows网络编程中winsock来实现的,当然这个只是简单的实现,你可以根据你的需求在你的项目里面进行更改。这里主要实现的通过客户机(Client) 通过监听服务器(Server)的需求进而向服务器传输指定文件。

操作步骤:

(1) 首先打开你的cmd控制台,查看你的端口号,输入命令:netstat -ano,如下图所示,TCP后面红色矩形框就是你部分的端口号。在client.cpp和server.cpp这两个文件中将“#define PORT  1029“改为你的可用端口号,比如“#define PORT  8128“,其中8128就是你某个可用端口号

                     

      (2) 如果你在同一台电脑上面进行模拟,是不用更改IP的,当然如果是两台电脑,这里就需要更改你的client.cpp和server.cpp这两个文件中#define SERVER_IP“127.0.0.1”,更改为你的Server服务器IP地址,查看你IP地址的方法为:打开你的打开你的cmd控制台,输入命令:ipconfig

(3) 然后新建两个工程即可,分别添加下面两个源文件,先运行客户端代码,然后运行服务器代码,输入想要接收客户端的文件名,就可以在你的服务器工程下接收到相应的文件。

服务器代码:

server.cpp

/************************************************************************* > File Name: Win_Server.c > Author: SongLee ************************************************************************/ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h> //#define PORT 8082
#define PORT 1029   //需要更改你可用的端口
#define SERVER_IP "127.0.0.1"
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
#pragma comment(lib, "WS2_32") int main()
{ // 声明并初始化一个服务端(本地)的地址结构 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); // 初始化socket dll WSADATA wsaData; WORD socketVersion = MAKEWORD(2, 0); if(WSAStartup(socketVersion, &wsaData) != 0) { printf("Init socket dll error!"); exit(1); } // 创建socket SOCKET m_Socket = socket(AF_INET, SOCK_STREAM, 0); if (SOCKET_ERROR == m_Socket) { printf("Create Socket Error!"); exit(1); } //绑定socket和服务端(本地)地址 if (SOCKET_ERROR == bind(m_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr))) { printf("Server Bind Failed: %d", WSAGetLastError()); exit(1); } //监听 if (SOCKET_ERROR == listen(m_Socket, 10)) { printf("Server Listen Failed: %d", WSAGetLastError()); exit(1); } while(1) { printf("Listening To Server...\n");    //监听服务器需求sockaddr_in client_addr; int client_addr_len = sizeof(client_addr); SOCKET m_New_Socket = accept(m_Socket, (sockaddr *)&client_addr, &client_addr_len); if (SOCKET_ERROR == m_New_Socket) { printf("Server Accept Failed: %d", WSAGetLastError()); break; } 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; } char file_name[FILE_NAME_MAX_SIZE+1]; memset(file_name, 0, FILE_NAME_MAX_SIZE+1); strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE ? FILE_NAME_MAX_SIZE:strlen(buffer)); printf("%s\n", file_name); FILE * fp = fopen(file_name, "rb"); //windows下是"rb",表示打开一个只读的二进制文件 if (NULL == fp) { printf("File: %s Not Found\n", file_name); } else { memset(buffer, 0, BUFFER_SIZE); int length = 0; while ((length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0) { if (send(m_New_Socket, buffer, length, 0) < 0) { printf("Send File: %s Failed\n", file_name); break; } memset(buffer, 0, BUFFER_SIZE); } fclose(fp); printf("File: %s Transfer Successful!\n", file_name); } closesocket(m_New_Socket); } closesocket(m_Socket); //释放winsock库 WSACleanup(); return 0;
} 

客户机代码:

client.cpp

/************************************************************************* > File Name: Win_Client.c > Author: SongLee ************************************************************************/ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h> //#define PORT 8082
#define PORT 1029    //需要更改你可用的端口
#define SERVER_IP "127.0.0.1"
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
#pragma comment(lib, "WS2_32") int main()
{ // 初始化socket dll WSADATA wsaData; WORD socketVersion = MAKEWORD(2, 0); if(WSAStartup(socketVersion, &wsaData) != 0) { printf("Init socket dll error!"); exit(1); } while(1){//创建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); if (SOCKET_ERROR == connect(c_Socket, (LPSOCKADDR)&server_addr, sizeof(server_addr))) { printf("Can Not Connect To Client IP!\n"); system("pause"); exit(1); } //输入文件名 char file_name[FILE_NAME_MAX_SIZE+1]; memset(file_name, 0, FILE_NAME_MAX_SIZE+1); printf("Please Input File Name On Client: "); scanf("%s", &file_name); char buffer[BUFFER_SIZE]; memset(buffer, 0, BUFFER_SIZE); strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE ? BUFFER_SIZE:strlen(file_name)); //向服务器发送文件名 if(send(c_Socket, buffer, BUFFER_SIZE, 0) < 0) { printf("Send File Name Failed\n"); system("pause"); exit(1); } //打开文件,准备写入 FILE * fp = fopen(file_name, "wb"); //windows下是"wb",表示打开一个只写的二进制文件 if(NULL == fp) { printf("File: %s Can Not Open To Write\n", file_name); system("pause"); exit(1); } else { memset(buffer, 0, BUFFER_SIZE); int length = 0; while ((length = recv(c_Socket, buffer, BUFFER_SIZE, 0)) > 0) { if (fwrite(buffer, sizeof(char), length, fp) < length) { printf("File: %s Write Failed\n", file_name); break; } memset(buffer, 0, BUFFER_SIZE); } printf("Receive File: %s From Client Successful!\n", file_name); } fclose(fp);closesocket(c_Socket); }//释放winsock库 WSACleanup(); system("pause"); return 0;
} 

win7系统两台电脑之间利用Socket实现文件传输---C++实现相关推荐

  1. 两台电脑之间怎么互相传文件

    两台电脑之间怎么互相传文件         给大家一个最简单的方法 ,也就是笔记本之间,这个方法很简单 将两台电脑用网线连接起来 ,然后 1.选择家庭组 2.创建家庭组 3. 这是候第二台电脑亮相了 ...

  2. 文件传输助手:两台电脑之间怎么互相传文件

    在生活中,传输文件几乎是每时每秒都在发生的事,今天小编给大家介绍一款文件传输助手--易我电脑迁移软件.为什么突然说起这款软件呢?是因为不少小伙伴都问到小编,两台电脑之间怎么互相传文件?其实,在这种情景 ...

  3. 两台电脑之间怎么互相传文件?

    ​随着技术的发展,我们似乎可以从家中或工作电脑远程访问另一台电脑.同时,一些用户也在想,"我能不能把文件从一台电脑远程传输到另一台电脑,这样我就可以在本地电脑上随心所欲地查看和编辑文件了&q ...

  4. 交换机和路由器区别+自动获取和使用固定IP的区别+win10系统设置网络ip+两台电脑之间怎么互相传文件+两电脑用一根网线传数据+

    文章目录 交换机和路由器区别 1 路由器可以为局域网自动分配IP和虚拟拨号 交换机只是用来分配网络数据的 路由器在网络层,根据IP地址寻址. 路由器可以处理"TCP/IP"协议,交 ...

  5. 详细教你两台电脑之间传文件

    当我们遇到两台电脑之间需相互要拷贝整个硬盘里的文件的时候,,我们又找不到这么大的移动存储设备,这时,两台电脑怎么传文件呢?也许有人一脸茫然.但是现在需要迷茫,小编这就向大家分享关于两台电脑怎么传文件的 ...

  6. 如何快速在两台电脑之间传输大文件

    两台电脑如何传文件最快方法.我们在使用电脑的时候,有的情况下需要我们队两台电脑之间互相的传输大文件.那么我们应该通过什么样的方法传输最快速呢?我们一起来看看吧. 首先我们需要一根平时上网连接网络时用的 ...

  7. 怎样用计算机传输文件,如何在两台电脑之间传输几百G的文件?教你一招

    原标题:如何在两台电脑之间传输几百G的文件?教你一招 电脑与电脑之间进行几百GB的文件传输怎么做呢?宽带传输效率太低,移动硬盘传输还得买个大硬盘,价格也比较贵. 那该怎么解决呢?So easy!一根网 ...

  8. 怎样进行两台电脑之间的数据传输?

    换新电脑后,需要将旧电脑的数据转移到新电脑:工作中,两台电脑之间互传数据等.那么,怎样进行两台电脑之间的数据传输呢? 下载   适用于 Windows 10/8/7/Vista/XP 方法一:直接 ...

  9. 测试两台电脑之间的网速

    测试两台CentOS系统之间的网速,使用工具iperf 1.在192.168.1.51服务器上下载并安装iperf wget https://iperf.fr/download/fedora/iper ...

最新文章

  1. hive币涨幅空间大吗_空间大、油耗低,家用MPV领域的三款全能好车,你心动了吗?...
  2. SpringMVC 异常统一处理
  3. ​Xamarin iOS教程之视图显示图像
  4. .NET(C#):警惕PLINQ结果的无序性
  5. java环境用openoffice转pdf
  6. Spark源码和调优简介 Spark Core
  7. R语言观察日志(part18)--.C和.Call
  8. android studio导出apk_Android 应用构建速度提升的十个小技巧
  9. HTML Table 冻结行列
  10. java api es_ES 常用java api
  11. χ² 分布到 F 分布到 ANOVA
  12. 每天一道剑指offer-重建二叉树
  13. Mugeda(木疙瘩)H5案例课—重力感应类H5-岑远科-专题视频课程
  14. 杀戮尖塔 地图生成器参考
  15. PowerDesigner将PDM导出生成WORD文档(rtf文档)
  16. 那些年我准备的前端面试题
  17. 关于野火mini led的学习
  18. Mycat快速入门(六): Mycat管理命令和监控
  19. 单页面优化有哪些可以参考的策略
  20. 投影仪全国产化电子元件推荐方案

热门文章

  1. 国内IDC成立SOC安全运营中心
  2. fuser命令使用说明
  3. socket编程(六)
  4. android 11 版本更新内容,android 11怎么更新 android 11更新方法
  5. 学习python的好处
  6. stm32 工业按键检测_STM32单片机按键消抖和FPGA按键消抖大全
  7. ajax如何提交多表单的值_菜狗教程-03-如何解决快速提交两次重复提交表单的问题...
  8. 电脑访问不了虚拟机ftp服务器,解决win环境下访问本机虚拟机中centos7 ftp服务器的问题...
  9. 获取mysql存储过程返回值_从强网杯随便注浅析mysql存储过程
  10. echarts常用方法(一)