在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 <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(1)
    {
        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 0;
} 

  在主函数开始时,首先输入服务器的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 = 1;  

    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,0);
    if( server_socket < 0)
    {
        printf("Create Socket Failed!");
        exit(1);
    }  

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

    if(listen(server_socket, LENGTH_OF_LISTEN_QUEUE))
    {
        printf("Server Listen Failed!");
        exit(1);
    }  

    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 < 0)
        {
            printf("Server Accept Failed: %d", WSAGetLastError());
            continue;
        }
        memset(buffer,0,sizeof(buffer));
        memset(file_name,0,sizeof(file_name));
        if (recv(newSocket,buffer,sizeof(buffer),0)<0)
        {
            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, 0, BUFFER_SIZE);
        int length = 0;
        while ((length = recv(newSocket, 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);
        }
        fclose(fp);
        close(newSocket);
        printf("file transfer success!\n");
    }

    close(server_socket);
    return 0;
}  

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

时间: 2024-10-07 06:29:07

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

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

工具WinSCP:windows和Linux中进行文件传输 2016-09-21 [转自]使用WinSCP软件在windows和Linux中进行文件传输 当我们的开发机是Windows,服务器是Linux时,如何在windows操作系统和linux操作系统之间进行文件传输呢?大部分使用ScureCRT或者putty远程登录,使用scp.wget等命令拷贝文件,也有不怕麻烦的在服务器上安装FTP服务器,或者启用samba甚至NFS.只是用Linux作为网页服务器,因为性能更好,更加安全稳定.这个时

使用PSFTP实现Windows、Linux之间的文件传输

安装PuTTY时自动安装了PSFTP 使用PSFTP可以实现Winodws.Linux之间的文件传输. 打开PSFTP,输入Linux的ip地址,输入要登录的用户名.密码 Windows向Linux传文件: put D:\jdk-8u241-linux-x64.rpm /root/jdk-8u241-linux-x64.rpm put  本地文件路径  目标文件路径. 注意windows的文件路径用\,Linux的文件路径用/. 如果目标路径只写文件名,比如  put   D:\jdk-8u24

用rz,sz命令在windows和linux间传送文件

经常需要在windows和linux之间上传和下载文件.使用ftp工具来工作有时候会觉得比较麻烦,切来切去的十分不方便,要是能够直接在终端进行上传和下载就好了.其实真有这样的方案,就是使用ZModem. 首先,需要在linux服务器上安装rz和sz两个工具,安装完成后就可以直接使用了.就不介绍过程了,我之前的博文记录过.不清楚的同学请移步linux安装rz和sz以及使用. rz,sz是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具. 然后,windows端需要支持Z

如何在windows下和linux下获取文件(如exe文件)的详细信息和属性

程序员都很懒,你懂的! 最近在项目开发中,由cs开发的exe的程序,需要自动升级,该exe程序放在linux下,自动升级时检测不到该exe程序的版本号信息,但是我们客户端的exe程序需要获取服务器上新程序的版本号信息.最后由我用java实现linux上exe文件的版本号读取功能.下面是详细代码: package com.herman.utils; import java.io.File; import java.io.FileNotFoundException; import java.io.I

Linux下远程文件传输命令——scp

SCP- secure copy (remote file copy program) 命令原型:  scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[[email protected]]host1:]file1 ... [[[email protected]]host2:]file2 命令描述: scp用于通过网

Linux C实现文件传输

对于Javascript的认识是来自于2011年夏天去实训基地做的一个网页项目,当时认为JavaScript是不是Java的一个派别语言什么的,老师那时候教我们调用了一些Javascript的方法.当时对这个语言的最初的印象就是会调用方法大致能懂就行了,没有深究.直到今年年初去面试几家企业,问我会不会使用Javascript,我说就调调几个方法就好了~   当时瞬间就直到无地自容了.于是将这本JavaScript的电子书看了下,写下相关的读书札记,也希望能让和我有着对Javascript误解的人

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

首先将pscp.exe文件放在某个文件夹中 新建*.bat文件 w-wx.bat代码 @echo off pscp.exe -pw l*****h D:\Windows-Linux\Data\* [email protected]:/home/ocean/alex/Others/Linux-Windows/Data pause w-xw.bat代码 @echo off pscp.exe -pw l*****h [email protected]:/home/ocean/alex/Others/L

Linux中常用文件传输命令及使用方法

sftp sftp即Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃取不仅可以传输文件数据,而且可以进行远程的文件管理. 建立连接: # sftp [email protected] 从本地上传文件: # put localpath 下载文件: # get remotepath 与远程相对应的本地操作,只需要在命令前加上”l” 即可,方便好记. 例如:lcd l

windows和linux下读取文件乱码的终极解决办法!

乱码是个很恶心的问题. windows和linux读取txt文件,一旦读取了,编码发生改变,就无法再还原了,只有重启项目. 网上有很多方法都是读取文件头,方法很好,但是亲测都不能用(右移8位判断0xff的,取3个字节的-1,-2的,大体上网上最多就这两种). 后来偶然发现一个方法,CharsetPrinter. 这个方法需要引入jar包,非常好用. public static String guessEncoding(String filename) { try { CharsetPrinter