要实现windows与linux间的文件传输,可以通过socket网络编程来实现。

  这次要实现的功能与《Windows下通过socket进行字符串和文件传输》中实现的功能相同,即客户端首先向服务器发送一个字符串,接着发送一个文件;服务器首先接收客户端发送的字符串,作为文件名,接着接收客户端发送的文件并保存到本地。

  以window平台程序作为客户端,linux平台的程序作为服务器,并且是在局域网范围内进行文件传输。

  windows客户端的实现:

  客户端程序在VS2012 IDE下编译运行,依旧使用在《Windows下通过socket进行字符串和文件传输》中简单封装实现的FileTransfer类,通过声明一个FileTransfer对象并调用相应的函数来发送数据和文件。其main函数如下:

/*************************************************************************
> File Name: 客户端主函数
>Author: xiongmao
>Purpose:在主函数中声明文件传输类的一个具体对象,向linux服务器发送文件
************************************************************************/ #include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "file_transfer.h"
using namespace std; int PORT;
string SERVER_IP ="127.0.0.1" ;
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
#pragma comment(lib, "WS2_32") int main()
{
cout<<"input ip and port"<<endl;
cin>>SERVER_IP>>PORT;
while()
{
bool flag;
string filename;
printf("input file name:");
cin>>filename;
FileTransfer ft;
ft.setIpAndPort(SERVER_IP,PORT);
ft.setFilePath(filename);
flag=ft.sendFile(filename,filename);
if (flag)
{
printf("send file %s success \n",filename.c_str());
}
else
{
printf("send file %d fail.The error code is : %d \n",GetLastError());
}
}
system("pause");
return ;
}

  在主函数开始时,首先输入服务器的ip地址和端口,接着输入想要发送的文件名(文件应在源码目录下存在),客户端就可完成文件袋额发送。

  linux服务器的代码:

  linux下仅使有一个main.cpp文件,实现简单的服务器功能,其代码如下:

//main.cpp

#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h> #define HELLO_WORLD_SERVER_PORT 8989
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024 int main(int argc, char **argv)
{
struct sockaddr_in server_addr;
int server_socket;
int opt = ; bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT); /* create a socket */
server_socket = socket(PF_INET,SOCK_STREAM,);
if( server_socket < )
{
printf("Create Socket Failed!");
exit();
} setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
{
printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
exit();
} if(listen(server_socket, LENGTH_OF_LISTEN_QUEUE))
{
printf("Server Listen Failed!");
exit();
} while (true)
{
printf("wait for file transfer...\n");
char file_name[BUFFER_SIZE];
char buffer[BUFFER_SIZE]; struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
//首先接收发送过来的字符串
int newSocket = accept( m_Socket, (sockaddr *)&client_addr, &client_addr_len);
if (newSocket < )
{
printf("Server Accept Failed: %d", WSAGetLastError());
continue;
}
memset(buffer,,sizeof(buffer));
memset(file_name,,sizeof(file_name));
if (recv(newSocket,buffer,sizeof(buffer),)<)
{
printf("recv file name fail!\n");
close(newSocket);
continue;
}
strncpy(file_name,buffer,strlen(buffer));
printf("recv file name : %s \n",file_name);
FILE * fp = fopen(file_name,"wb");
if (fp==NULL)
{
printf("open file error\n");
continue;
}
//获取字符串后继续获取文件数据
memset(buffer, , BUFFER_SIZE);
int length = ;
while ((length = recv(newSocket, buffer, BUFFER_SIZE, )) > )
{
if (fwrite(buffer, sizeof(char), length, fp) < length)
{
printf("File: %s Write Failed\n", file_name);
break;
}
memset(buffer, , BUFFER_SIZE);
}
fclose(fp);
close(newSocket);
printf("file transfer success!\n");
} close(server_socket);
return ;
}

  在linux下,进入main.cpp所在的目录,使用命令

gcc main.cpp -o main.out

来编译服务器端程序,再使用命令

./main.out

来执行编译的程序,即可启动服务器。

  通过比较《Windows下通过socket进行字符串和文件传输》中服务器程序的实现,观察到代码实现基本上一致,linux下的实现存在以下几点不同:

  1、linux下用来绑定端口,实现监听的socket server_socket的声明为int类型,而在window下则为SOCKET类型。

  2、linux下,关闭socket的函数为close,使用该函数需要包含unistd.h头文件,windows下则是用closesocket来关闭socket。

  3、使用bzero函数来进行置零操作。bzero函数不是标准函数,不推荐使用。非标准函数的使用会对程序的移植造成不便。bzero函数的功能可以用memset函数来实现。

在windows 与Linux间实现文件传输(C++&C实现)的更多相关文章

  1. 工具WinSCP:windows和Linux中进行文件传输

    工具WinSCP:windows和Linux中进行文件传输 2016-09-21 [转自]使用WinSCP软件在windows和Linux中进行文件传输 当我们的开发机是Windows,服务器是Lin ...

  2. 如何实现windows和linux之间的文件传输

    2010-04-25 18:10 如何实现windows和linux之间的文件传输 如果想从windows中传送大量文件到Linux中,想必会难倒部分Linux初学者,尤其是文件很大时.我曾试过在li ...

  3. Xshell在Windows和Linux间文件的上传和下载

    本文通过lrzsz来实现Windows和Linux间文件间的文件传输. lrzsz使用 XMODEM.YMODEM 和 ZMODEM 文件传输协议来实现文件的上传和下载.相比 FTP 或者 WinSC ...

  4. 【Linux学习笔记】用nc实现两台主机间的文件传输(不需要输密码)

    通常,可以用scp完成两台主机间的文件传输任务,但在主机间未建立信任关系的情况下,scp每次都需要输入密码,用起来感觉不是很方便,之前这篇笔记介绍过不用输入密码执行脚本或传输文件的方法,但对于一些临时 ...

  5. Windows与Linux之间海量文件的传输与Linux下大小写敏感问题

    Windows与Linux之间海量文件的传输与Linux下大小写敏感问题 mount.cifs 支持通过网络文件系统挂载,不过需要安装cifs-utils,也可通过mount -t cifs挂载,详细 ...

  6. linux几种文件传输方式

    本文记录linux系统中文件传输的多种方式,留作备忘.linux中文件传输的方式有ftp,scp,rsync,rz,sz等,但各个工具的功能又有所区别: FTP : FTP是文件服务器,可实现文件的上 ...

  7. 使用pscp命令在Windows与linux之间拷贝文件

    在Linux环境下做开发时,我们可能会在windows下远程控制Linux系统,本文介绍如何使用putty的pscp.exe在Windows和 Linux(本文使用fedora)之间copy文件. 工 ...

  8. linux CentOS 安装rz和sz命令 lrzsz 实现windows和linux之间的文件上传 下载

    https://blog.nbhao.org/1902.html https://bbs.csdn.net/topics/391989523 https://www.cnblogs.com/zhoul ...

  9. WinScp结合Putty在Windows与UNIX之间进行文件传输

    1. 关于传输协议: SSH Secure Shell安全外壳协议 SFTP Secure File Transfer Protocal安全文件传送协议 2. WinScp与Putty的作用: Put ...

随机推荐

  1. 《DSP using MATLAB》示例Example5.14

    代码: x1 = [1,2,2]; x2 = [1,2,3,4]; y = circonvt(x1,x2,4) n1 = 0:1:length(x1)-1; n2 = 0:1:length(x2)-1 ...

  2. Android入门(五):程序架构——MVC设计模式在Android中的应用

    刚刚接触编程的的人,可能会这样认为:只要代码写完了能够跑起来就算完工了.如果只是写一个小程序,“能够跑起来”这样的标准也就可以了,但是如果你是在公司进行程序的开发,那么仅仅让程序成功的跑起来是不行的, ...

  3. Django分析之导出为PDF文件

    最近在公司一直忙着做exe安装包,以及为程序添加新功能,好久没有继续来写关于Django的东西了….难得这个周末清闲,来了解了解Django的一些小功能也是极好的了~ 那今天就来看看在Django的视 ...

  4. linux shell trap的使用

    原文地址:http://blog.sina.com.cn/s/blog_62eb16bb01014dbh.html 一. trap捕捉到信号之后,可以有三种反应方式: (1)执行一段程序来处理这一信号 ...

  5. PHP与apache环境配置

    最近想了解一些网页后台的东西,在看Luke Welling,laura Thomson的<php与mysql web开发>,书中环境配置的部分很庞杂,网上的各种教程也很乱,搞了一下午终于成 ...

  6. Odoo Email Template Problem

    Odoo 8.0 的邮件模板是运行自jiajin2沙盒中的阉割版mako,像自定义及 <%%>等功能都无法正常使用. 且for-loop %for %endfor不能嵌套在table中使用 ...

  7. HTML语法大全

      卷标 , 属性名称 , 简介  002 <! - - ... - -> 批注  003 <!> 跑马灯  004 <marquee>...</marque ...

  8. InnoDB与Myisam的六大区别

    MyISAM     InnoDB   构成上的区别:   每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型. .frm文件存储表定义. 数据文件的扩展名为. ...

  9. Unity学习疑问记录之保卫伦敦塔学习体会

    1.生成的prefab如果要产生反向: Instantiate(Rocket, rocketPosition.position, Quaternion.Euler(new Vector3(0,0,18 ...

  10. C# 控制datagridview的combox属性的列绑定数据

    //datagridvie列绑定list的数据 List<User> listChange = GetChange();//查询数据库内容,保存到list this.datagridvie ...