file_server.c  文件传输顺序服务器示例

//
// file_server.c  文件传输顺序服务器示例
//
//本文件是服务器的代码
#include <netinet/in.h>    // for sockaddr_in
#include <sys/types.h>    // for socket
#include <sys/socket.h>    // for socket
#include <stdio.h>        // for printf
#include <stdlib.h>        // for exit
#include <string.h>        // for bzero
/*
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
*/
#define HELLO_WORLD_SERVER_PORT    6666
#define LENGTH_OF_LISTEN_QUEUE  20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512int main(int argc, char **argv)
{//设置一个socket地址结构server_addr,代表服务器internet地址, 端口struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htons(INADDR_ANY);server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);//创建用于internet的流协议(TCP)socket,用server_socket代表服务器socketint server_socket = socket(PF_INET,SOCK_STREAM,0);if( server_socket < 0){printf("Create Socket Failed!");exit(1);}//把socket和socket地址结构联系起来if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))){printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT); exit(1);}//server_socket用于监听if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) ){printf("Server Listen Failed!"); exit(1);}while (1) //服务器端要一直运行{//定义客户端的socket地址结构client_addrstruct sockaddr_in client_addr;socklen_t length = sizeof(client_addr);//接受一个到server_socket代表的socket的一个连接//如果没有连接请求,就等待到有连接请求--这是accept函数的特性//accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信//new_server_socket代表了服务器和客户端之间的一个通信通道//accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);if ( new_server_socket < 0){printf("Server Accept Failed!\n");break;}char buffer[BUFFER_SIZE];bzero(buffer, BUFFER_SIZE);length = recv(new_server_socket,buffer,BUFFER_SIZE,0);//这里先接收客户端发来的要获取的文件名if (length < 0){printf("Server Recieve Data Failed!\n");break;}char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
//        int fp = open(file_name, O_RDONLY);
//        if( fp < 0 )FILE * fp = fopen(file_name,"r");if(NULL == fp ){printf("File:\t%s Not Found\n", file_name);}else{bzero(buffer, BUFFER_SIZE);int file_block_length = 0;
//            while( (file_block_length = read(fp,buffer,BUFFER_SIZE))>0)while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp))>0){printf("file_block_length = %d\n",file_block_length);//发送buffer中的字符串到new_server_socket,实际是给客户端if(send(new_server_socket,buffer,file_block_length,0)<0){printf("Send File:\t%s Failed\n", file_name);break;}bzero(buffer, BUFFER_SIZE);}                                                                 //这段代码是循环读取文件的一段数据,在循环调用send,发送到客户端,这里强调一点的TCP每次接受最多是1024字节,多了就会分片,因此每次发送时尽量不要超过1024字节。
//            close(fp);fclose(fp);printf("File:\t%s Transfer Finished\n",file_name);}//关闭与客户端的连接close(new_server_socket);}//关闭监听用的socketclose(server_socket);return 0;
}

 file_client.c  文件传输客户端程序示例

//
// file_client.c  文件传输客户端程序示例
//
//本文件是客户机的代码
#include <netinet/in.h>    // for sockaddr_in
#include <sys/types.h>    // for socket
#include <sys/socket.h>    // for socket
#include <stdio.h>        // for printf
#include <stdlib.h>        // for exit
#include <string.h>        // for bzero
/*
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
*/#define HELLO_WORLD_SERVER_PORT    6666
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512int main(int argc, char **argv)
{if (argc != 2){printf("Usage: ./%s ServerIPAddress\n",argv[0]);exit(1);}//设置一个socket地址结构client_addr,代表客户机internet地址, 端口struct sockaddr_in client_addr;bzero(&client_addr,sizeof(client_addr)); //把一段内存区的内容全部设置为0client_addr.sin_family = AF_INET;    //internet协议族client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自动获取本机地址client_addr.sin_port = htons(0);    //0表示让系统自动分配一个空闲端口//创建用于internet的流协议(TCP)socket,用client_socket代表客户机socketint client_socket = socket(AF_INET,SOCK_STREAM,0);if( client_socket < 0){printf("Create Socket Failed!\n");exit(1);}//把客户机的socket和客户机的socket地址结构联系起来if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr))){printf("Client Bind Port Failed!\n"); exit(1);}//设置一个socket地址结构server_addr,代表服务器的internet地址, 端口struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr));server_addr.sin_family = AF_INET;if(inet_aton(argv[1],&server_addr.sin_addr) == 0) //服务器的IP地址来自程序的参数{printf("Server IP Address Error!\n");exit(1);}server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);socklen_t server_addr_length = sizeof(server_addr);//向服务器发起连接,连接成功后client_socket代表了客户机和服务器的一个socket连接if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0){printf("Can Not Connect To %s!\n",argv[1]);exit(1);}char file_name[FILE_NAME_MAX_SIZE+1];bzero(file_name, FILE_NAME_MAX_SIZE+1);printf("Please Input File Name On Server:\t");scanf("%s", file_name);char buffer[BUFFER_SIZE];bzero(buffer,BUFFER_SIZE);strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));//向服务器发送buffer中的数据send(client_socket,buffer,BUFFER_SIZE,0);//    int fp = open(file_name, O_WRONLY|O_CREAT);
//    if( fp < 0 )FILE * fp = fopen(file_name,"w");if(NULL == fp ){printf("File:\t%s Can Not Open To Write\n", file_name);exit(1);}//从服务器接收数据到buffer中bzero(buffer,BUFFER_SIZE);int length = 0;while( length = recv(client_socket,buffer,BUFFER_SIZE,0))       //循环接收,再写到文件{if(length < 0){printf("Recieve Data From Server %s Failed!\n", argv[1]);break;}
//        int write_length = write(fp, buffer,length);int write_length = fwrite(buffer,sizeof(char),length,fp);if (write_length<length){printf("File:\t%s Write Failed\n", file_name);break;}bzero(buffer,BUFFER_SIZE);    }printf("Recieve File:\t %s From Server[%s] Finished\n",file_name, argv[1]);close(fp);//关闭socketclose(client_socket);return 0;
}

Linux C 实现文件传输相关推荐

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

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

  2. linux做完sftp端口分离后ftp,Linux 中实现文件传输服务(FTP、SFTP)

    ????本文将介绍如何在Linux中实现文件传输,这里主要使用FTP.SFTP. ????FTP ????废话少说,直接进入正题,需要注意,FTP采用Client/Server架构,并且有两个信道(控 ...

  3. Windows 与 Linux之间进行文件传输,文件传输工具Cuteftp的使用方法。

    文件传输工具Cuteftp的使用方法 Cuteftp是一款FTP客户端软件,只要在linux上安装.启动了FTP服务,就可以使用Cuteftp在Windows 与 Linux之间进行文件传输. 一.  ...

  4. windows与Linux实时传输数据,I01 物理隔离条件下Windows与Linux服务器的文件传输脚本...

    title: I01 物理隔离条件下Windows与Linux服务器的文件传输脚本author: Adolph Leecategories: 进阶tags: paramiko打怪升级mathjax: ...

  5. tftpd32服务器软件在Windows与linux 下的文件传输(服务器ip 的设置问题)

    tftpd32服务器软件在Windows与linux 下的文件传输 https://blog.csdn.net/stoic163/article/details/42804421 2015年01月17 ...

  6. mac服务器文件传输,scp实现mac与linux服务器之间文件传输

    1.mac上传文件到linux服务器 scp 文件名 用户名@服务器ip:目标路径 如:scp -P端口号 /Users/test/testFile test@xxx.xxx.xxx.xxx:/tes ...

  7. Linux 几种文件传输方式

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

  8. Linux中的文件传输优化

    Linux中的文件传输优化 1.scp远程传输命令 1.1把本地文件复制到远程主机 1.2把远程文件复制到本地 2.rsync远程同步命令 2.1 rsync和scp对比 2.2 rsync用法 3. ...

  9. Filezilla搭建Linux与Windows文件传输设置

    Filezilla搭建Linux与Windows文件传输设置 1.基本思路 2.linux虚拟机设置 2.windows下载安装FTP软件filezilla 1.基本思路 下载资源在windos下比较 ...

  10. linux 定时传送文件,Windows与Linux之间定时文件传输

    需要的朋友点击链接,这里有更详细的实现过程 一.获取WinSCP windows上装上Winscp程序,使用这个程序通过sftp协议把本地的文件传输到linux服务器上. winscp下载链接 二.编 ...

最新文章

  1. 面试: String 五连杀 !你还满血吗 ?
  2. 基于MATLAB的FFT傅立叶分析
  3. Python 常见的内置模块
  4. PyCharm安装Twisted库(报错:Microsoft Visual C++ 14.0 is required. Get it with “Build Tools for Visual Stu)
  5. Emacs sql-mode 自动连接数据库 (当前仅支持MySQL)
  6. Exception in thread “main“ java.util.ConcurrentModificationException
  7. 纯css实现div中未知尺寸图片的垂直居中
  8. 泰山游记:道阻且长,活着走出
  9. 【网络攻防技术】实验八——SQL注入实验
  10. 高阶的Parser:可变运算优先级
  11. mac磁盘清理的方法大全
  12. java短信验证码_java实现发送短信验证码
  13. PCL中点云配准(非常详细,建议收藏)
  14. Mac 清理存储空间
  15. chrome浏览器多页签唯一关闭时自动注销
  16. jaffe 数据库百度网盘下载
  17. UVa 紫书50题留念
  18. 编辑视角下,论文摘要、引言、结论怎么写?
  19. P4850 [IOI2009]葡萄干raisins 记忆化搜索
  20. HTML label标签介绍

热门文章

  1. 云计算安全威胁集中营
  2. Configure NFS Server On AIX 6.1
  3. Jenkins部署Windows UI自动化的调度权限问题
  4. dataTable() 与 DataTable() 的差别与处理方式
  5. Mybatis --- SelectKey
  6. 逆向思维--魔兽世界封包分析(1)
  7. 老焦专栏 | 如何做一个有说服力的方案?
  8. camelot工具进行pdf表格解析重建
  9. 排查一般MySQL性能问题
  10. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑