linux和c之间的关系,在windows 与Linux间实现文件传输(C++&C实现)

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

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

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

windows客户端的实现:

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

/*************************************************************************

> File Name: 客户端主函数

>Author: xiongmao

>Purpose:在主函数中声明文件传输类的一个具体对象,向linux服务器发送文件

************************************************************************/

#include

#include

#include

#include

#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<

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

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#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函数来实现。

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

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

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

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

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

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

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

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

linux几种文件传输方式

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

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

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

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

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

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

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

【262】pscp命令 实现windows与linux互传文件

首先将pscp.exe文件放在某个文件夹中 新建*.bat文件 w-wx.bat代码 @echo off pscp.exe -pw l*****h D:\Windows-Linux\Data\* oc ...

随机推荐

one way WebService

WSDL支持4种消息交换方式:   1)单向(One-way):服务端接收消息:   2)请求响应(Request-response):服务端点接收请求消息,然后发送响应消息:   3)要求应答(So ...

SSM框架通过mybatis-generator自动生成代码

一.首先eclipse配置好maven环境,并且创建好一个SSM框架的工程 二.在pom.xml中添加plugin ssm_web< ...

TensorFlow实战之Softmax Regression识别手写数字

关于本文说明,本人原博客地址位于http://blog.csdn.net/qq_37608890,本文来自笔者于2018年02月21日 23:10:04所撰写内容(http://blog.c ...

Redis在Windows中安装方法

首先下载Redis 下载地址:https://github.com/MSOpenTech/redis/releases Redis支持32位和64位,这个需要根据你系统平台的实际情况选择,我的是64位 ...

hihocoder &num;1828 &colon; Saving Tang Monk II(BFS)

描述 (also ) is one of the Four Great Classical Novels of Chi ...

Mysql常用函数总结&lpar;二&rpar;

有的时候们需要了解当前的时间,这时候我们就可以调用时间函数了.下面就是一些常用的时间函数下面来说一下DATE_FORMAT(date,format):format可以有以下格式符:举个例子吧! mys ...

【常用配置】Hadoop-2&period;6&period;5在Ubuntu14&period;04下的伪分布式配置

core-site.xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet t ...

linux环境中,如何解压后缀是bz2的压缩包?tar&period;bz2格式的压缩包,如何进行解压?

问题说明: 今天下载了一个nagios中文的包,名字nagios-cn-3.2.3.tar.bz2,即以tar.bz2结尾,经常解压tar.gz 突然想不起来这个用什么命令来解压了.百度了下,再次记录 ...

UICollectionView横向分页

效果图: 代码: HCollectionViewCell.h #import @interface HCollectionViewCell : UIColl ...

树莓派3 U盘启动 配置 &amp&semi; 即 MSD启动 总结

树莓派3添加了一个新特性:允许USB启动.现在我们既可以从SD卡启动,也可以从USB启动.USB设备可以是U盘,带USB适配器的SSD硬盘,甚至是移动硬盘. 本文介绍怎么从U盘启动树莓派3.   1. ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值