darren_nizna 发表于 2013-1-31 11:48:25

linux下读取日志文件上传到服务器

日志文件会不断的增加,这个程序能上传这不断增加的日志文件到服务器,以便服务器分析。

#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 ){    int          info;      /* 临时变量*/    intsockfd;    /* 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;    int t= transportLogFileToServer( "10.2.53.119",4464, "./testFile.txt", error );    if( t== 0 ){      printf("%s\n",error );    }return 0;}
页: [1]
查看完整版本: linux下读取日志文件上传到服务器