0
点赞
收藏
分享

微信扫一扫

Linux 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 512  ​



​      ​​ 



​int​​​​ main(​​​​int​​​​ argc, ​​​​char​​​​ **argv)  ​



​{  ​



​    ​​​​//设置一个socket地址结构server_addr,代表服务器internet地址, 端口  ​



​    ​​​​struct​​​​ sockaddr_in server_addr;  ​



​    ​​​​bzero(&server_addr,​​​​sizeof​​​​(server_addr)); ​​​​//把一段内存区的内容全部设置为0  ​



​    ​​​​server_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代表服务器socket  ​



​    ​​​​int​​​​ 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_addr  ​



​        ​​​​struct​​​​ 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 Foundn"​​​​, 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 = %dn"​​​​,file_block_length);  ​



​                ​​​​//发送buffer中的字符串到new_server_socket,实际是给客户端  ​



​                ​​​​if​​​​(send(new_server_socket,buffer,file_block_length,0)<0)  ​



​                ​​​​{  ​



​                    ​​​​printf(​​​​"Send File:t%s Failedn"​​​​, file_name);  ​



​                    ​​​​break​​​​;  ​



​                ​​​​}  ​



​                ​​​​bzero(buffer, BUFFER_SIZE);  ​



​            ​​​​}                                                                 ​​​​//这段代码是循环读取文件的一段数据,在循环调用send,发送到客户端,这里强调一点的TCP每次接受最多是1024字节,多了就会分片,因此每次发送时尽量不要超过1024字节。  ​



​//            close(fp);  ​



​            ​​​​fclose(fp);  ​



​            ​​​​printf(​​​​"File:t%s Transfer Finishedn"​​​​,file_name);  ​



​        ​​​​}  ​



​        ​​​​//关闭与客户端的连接  ​



​        ​​​​close(new_server_socket);  ​



​    ​​​​}  ​



​    ​​​​//关闭监听用的socket  ​



​    ​​​​close(server_socket);  ​



​    ​​​​return​​​​ 0;  ​



​}​







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




双击代码全选



1



2



3



4



5



6



7



8



9



10



11



12



13



14



15



16



17



18



19



20



21



22



23



24



25



26



27



28



29



30



31



32



33



34



35



36



37



38



39



40



41



42



43



44



45



46



47



48



49



50



51



52



53



54



55



56



57



58



59



60



61



62



63



64



65



66



67



68



69



70



71



72



73



74



75



76



77



78



79



80



81



82



83



84



85



86



87



88



89



90



91



92



93



94



95



96



97



98



99



100



101



102



103



104



105



106



107



108



109



110



111



112



113






​//  ​



​// 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 512  ​



​      ​​ 



​int​​​​ main(​​​​int​​​​ argc, ​​​​char​​​​ **argv)  ​



​{  ​



​    ​​​​if​​​​ (argc != 2)  ​



​    ​​​​{  ​



​        ​​​​printf(​​​​"Usage: ./%s ServerIPAddressn"​​​​,argv[0]);  ​



​        ​​​​exit(1);  ​



​    ​​​​}  ​



​      ​​ 



​    ​​​​//设置一个socket地址结构client_addr,代表客户机internet地址, 端口  ​



​    ​​​​struct​​​​ sockaddr_in client_addr;  ​



​    ​​​​bzero(&client_addr,​​​​sizeof​​​​(client_addr)); ​​​​//把一段内存区的内容全部设置为0  ​



​    ​​​​client_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代表客户机socket  ​



​    ​​​​int​​​​ 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 Writen"​​​​, 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 Failedn"​​​​, file_name);  ​



​            ​​​​break​​​​;  ​



​        ​​​​}  ​



​        ​​​​bzero(buffer,BUFFER_SIZE);      ​



​    ​​​​}  ​



​    ​​​​printf(​​​​"Recieve File:t %s From Server[%s] Finishedn"​​​​,file_name, argv[1]);  ​



​          ​​ 



​    ​​​​close(fp);  ​



​    ​​​​//关闭socket  ​



​    ​​​​close(client_socket);  ​



​    ​​​​return​​​​ 0;  ​



​}​







举报

相关推荐

linux文件传输

Linux文件传输

Linux 文件传输sz

linux scp文件传输

linux中的文件传输

346-Linux 文件传输

【文件传输】

0 条评论