日志文件会不断的增加,这个程序能上传这不断增加的日志文件到服务器,以便服务器分析。
#include <sys/socket.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/sendfile.h> #define SA struct sockaddr /** * 如果出现错误,程序返回 0, 错误信息保存在 error 数组中 * server 服务端的 IP, 字符串表示 如 “192.168.1.1” * port 连接服务端的端口,一个 16 位整数 * logFilePath 客户端日志文件的位置 * error 程序出错将错误信息返回在这个数组中 */ int transportLogFileToServer( char* server, int port, char* logFilePath, char error[100] ){ int info; /* 临时变量 */ int sockfd; /* socket 描述符 */ struct sockaddr_in servaddr; /* 套接字 */ /* 初始化错误信息 */ strcpy( error, "Everything is ok!!" ); /* 获得 socket 描述符 */ sockfd= socket( AF_INET, SOCK_STREAM, 0 ); if( sockfd== -1 ){ strcpy( error, "Get socket descriptor error, connect again!" ); return 0; } /* 初始化 socket 为零 */ bzero( &servaddr, sizeof(servaddr) ); /* 设置协议 */ servaddr.sin_family = AF_INET; /* 设置端口 */ servaddr.sin_port = htons( port ); /* 设置服务端 IP */ info= inet_pton( AF_INET, server, &servaddr.sin_addr ); if( info== -1 ){ strcpy( error, "The ip address format is error!"); return 0; } /* 连接服务端 */ info= connect( sockfd, (SA*)&servaddr, sizeof(servaddr) ) ; if( info== -1 ){ strcpy( error, "Connect server error, check the server address or port!"); return 0; } /* 打开日志文件 */ FILE* file= fopen( logFilePath, "r"); if( file== NULL ){ strcpy( error, "Can't open the log file, please check the path or if you have the right to read!"); return 0; } /* 获得日志文件的文件描述符 */ int fd= fileno( file ); /* 文件指针指向文件末尾,便于得到文件长度 */ fseek( file, 0, SEEK_END ); /* 初始化 pre 为文件长度 */ long pre= ftell( file ); long now= 0; while( 1 ){ fseek( file, 0, SEEK_END ); now= ftell( file ); /* 如果 now> pre, 说明日志文件已经写入了数据 */ if( pre== now ) continue; /* 将文件指针指向 pre 位置 */ fseek( file, pre, SEEK_SET ); /* 将 pre 到 now 这一段的数据发送 */ sendfile( sockfd, fd, &pre, now- pre ); pre= now; } return 1; } int main(){ char error[1000]; int t= transportLogFileToServer( "10.2.53.119", 4464, "./testFile.txt", error ); if( t== 0 ){ printf("%s\n",error ); } return 0; }