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[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;
}
 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值