监听514端口收消息,调用脚本发送收到的消息

rcv.c--监听514端口并收消息,调用脚本zip_file_check.sh发消息。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <errno.h>

#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include <time.h>

#define MYPORT 514

#define MY_FILE "/home/uniadmin/neo/test/lvwengang/zipfile"
#define LOG_FILE "/home/uniadmin/neo/test/lvwengang/logfile.log"

struct packet {
        char data[1024];
};

void handle(int sig) {
        fprintf(stderr,"A %d signal.\n",sig);
        return;
}

int log_file(char *path,char *mode,char *data) {
        int ret;
        FILE *fp,*fp_log;

        time_t timep;
        struct tm *tp;
        char nowtime[128];

        if(strstr(path,"zipfile")) {
                fp=fopen(path,mode);
                if(fp==NULL) {
                        fprintf(stderr,"fopen() error.\n");
                        exit(-1);
                }

                ret=fprintf(fp,"%s\n",data);
                if(ret==-1) {
                        fprintf(stderr,"fprintf() error.\n");
                        exit(-1);
                }

                ret=fclose(fp);
                if(ret==EOF) {
                        fprintf(stderr,"fclose() error.\n");
                        exit(-1);
                }
        }
        else if(strstr(path,"logfile")) {
                fp_log=fopen(path,"a+");
                if(fp_log==NULL) {
                        fprintf(stderr,"fopen() error.\n");
                        exit(-1);
                }

                timep=time(NULL);
                tp=localtime(&timep);
                sprintf(nowtime,"%d-%02d-%02d-%02d-%02d-%02d",1900+tp->tm_year,(1+tp->tm_mon),tp->tm_mday,tp->tm_hour,tp->tm_min,tp->tm_sec);

                fprintf(fp_log,"%s\n",nowtime);
                fprintf(fp_log,"%s",data);
                fprintf(fp_log,"%s\n\n\n","Ok!! mail send success...");

                ret=fclose(fp_log);
                if(ret==EOF) {
                        fprintf(stderr,"fclose() error.\n");
                        exit(-1);
                }
        }

        return 0;
}

int main(void) {
        int sd,ret;
        int his_end_len;
        struct packet pkt;
        struct sockaddr_in my_end,his_end;

/*
        //-- to backgroud
        int fd;
        pid_t pid;

        pid=fork();
        if(pid==-1) {
                perror("fork()");
                exit(-1);
        }

        if(pid!=0) {
                exit(0);
        }

        fd=open("/dev/null",O_RDONLY);
        if(fd==-1) {
                perror("open()");
        } else {
                close(STDIN_FILENO);
                dup(fd);
                close(fd);
        }

        fd=open("/dev/null",O_WRONLY);
        if(fd==-1) {
                perror("open()");
        } else {
                close(STDOUT_FILENO);
                dup(fd);
                close(STDERR_FILENO);
                dup(fd);
                close(fd);
        }

        setsid();

        chdir("/");
        //--
*/

        signal(SIGCHLD,handle);

        sd=socket(PF_INET,SOCK_DGRAM,0);
        if(sd==-1) {
                perror("socket()");
                exit(-1);
        }

        int flag=1,len=sizeof(int); 
        ret=setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,&flag,len);
        if(ret==-1) {
                fprintf(stderr,"setsockopt() error.\n");
        }

        my_end.sin_family=AF_INET;
        my_end.sin_port=htons(MYPORT);
        my_end.sin_addr.s_addr=inet_addr("0.0.0.0");

        ret=bind(sd,(struct sockaddr *)&my_end,sizeof(my_end));
        if(ret==-1) {
                perror("bind()");
                exit(-1);
        }

        his_end_len=sizeof(his_end);

        while(1) {
                do { 
                        ret=recvfrom(sd,&pkt,sizeof(pkt),0,(struct sockaddr *)&his_end,&his_end_len);
                //      if(ret==-1 && errno==EINTR)
                //              fprintf(stderr,"A signal.\n");
                //} while(ret==-1 && errno==EINTR);
                } while(ret==-1);
                pkt.data[ret]='\0';

                // write MY_FILE
                ret=log_file(MY_FILE,"w",pkt.data);
                if(ret==-1) {
                        fprintf(stderr,"log_file(MY_FILE) error.\n");
                }

                // send mail
                system("/home/uniadmin/neo/test/lvwengang/zip_file_check.sh");

                // write LOG_FILE
                ret=log_file(LOG_FILE,"a+",pkt.data);
                if(ret==-1) {
                        fprintf(stderr,"log_file(MY_FILE) error.\n");
                }
        }

        exit(0);
}

zip_file_check.sh--发送收到的消息

#!/bin/sh

MY_PATH=/home/uniadmin/neo/test/lvwengang

FILE=zipfile

DATE=`date +%Y-%m-%d-%H-%M-%S`

NEW_FILE=$FILE-$DATE

# my mail
my_mail() {
        if [ -e $MY_PATH/$FILE ] ; then
                /bin/mv $MY_PATH/$FILE $MY_PATH/$NEW_FILE
        #       /bin/mail -s '75.61 log ...' lvwengang@chinaunicom.cn < $MY_PATH/$NEW_FILE
        #       /bin/mail -s '75.61 log ...' -c lvwengang@chinaunicom.cn send2@m165.com < $MY_PATH/$NEW_FILE
                /bin/mail -s '75.61 log ...' send2@m165.com < $MY_PATH/$NEW_FILE
        fi
}

# 30 day ago delete file
delete_file() {
        find $MY_PATH -name 'zipfile*' -mtime +3 -exec rm {} \;
}

# execute
my_mail
delete_file

exit 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值