Linux下守护进程和socket综合应用
参考代码:
/*
* filename: init.c
*
*/
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/param.h>
void init_daemon(void)
{
int pid;
int i=0;
if(pid = fork())
{
exit(0); //if father,kill it
}
else if(pid<0)
{
exit(1); //fork error ,quit
}
setsid();//first subprocess become new session boss and process boss
//leave with terminal
if(pid = fork())
{
exit(0); //first sub,kill it
}
else if(pid<0)
{
exit(1); //fork error,quit
}
for(i=0; i<NOFILE; ++i)
{
close(i); //close file description
}
chdir("/tmp"); //change work dir to /tmp
umask(0); //reset file mask
return ;
}
/*
* filename: server.c
*
* get time from server
*
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#define SIZE 1024
/* daemon init */
void init_daemon(void);
/* func: report error message to log */
static void bail(const char *on_what)
{
FILE *fp = NULL;
time_t tt;
if((fp = fopen("/tmp/socket.log", "a"))!=NULL)
{
tt = time(0);
fprintf(fp, "server> %s error %s\n", asctime(localtime(&tt)), on_what);
}
fclose(fp);
exit(1);
}
/* func: report server process action */
static void printlog(const char *on_what)
{
FILE *fp = NULL;
time_t tt;
if((fp = fopen("/tmp/socket.log", "a"))!=NULL)
{
tt = time(0);
fprintf(fp, "server> %s do: %s\n", asctime(localtime(&tt)), on_what);
}
fclose(fp);
}
int main(int argc, char *argv[])
{
if(argc<2)
{
printf("please input server port\n");
return -1;
}
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size;
int ret;
int sfd;
int cfd;
int nbytes;
time_t tt;
char buf[SIZE] = {0};
/* init daemon process */
init_daemon();
printlog("Set server process id daemon process!");
sfd = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == sfd)
{
bail("socket()");
}
printlog("create socket success!");
bzero(&server_addr, sizeof(server_addr));
bzero(&client_addr, sizeof(client_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(atoi(argv[1]));
server_addr.sin_addr.s_addr = INADDR_ANY;
sin_size = sizeof(server_addr);
ret = bind(sfd, (struct sockaddr*)&server_addr, sin_size);
if(-1==ret)
{
bail("bind()");
}
printlog("bind socket success!");
ret = listen(sfd, 10);
if(-1==ret)
{
bail("listen()");
}
printlog("start listen.... ");
while(1)
{
cfd = accept(sfd, (struct sockaddr *)&client_addr, &sin_size);
if(-1 == cfd)
{
bail("accept()");
}
printlog("get connection from");
printlog(inet_ntoa(client_addr.sin_addr));
/* create time stamp */
time(&tt);
ret = (int)strftime(buf, sizeof(buf), "%A %b %d %H:%M:%S %Y\n", localtime(&tt));
nbytes = write(cfd, buf, ret);
if(nbytes<=0)
{
bail("write()");
}
printlog("send time stamp success!");
close(cfd);
}
close(sfd);
return 0;
}
/*
* filename: client.c
* daytime client
*
*
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#define SIZE 1024
/* func: report error message to log */
static void bail(const char *on_what)
{
FILE *fp=NULL;
time_t tt;
if((fp = fopen("/tmp/socket.log", "a"))!=NULL)
{
tt = time(0);
fprintf(fp, "client: %s error %s\n", asctime(localtime(&tt)), on_what);
}
fclose(fp);
exit(1);
}
/* func: report client process action */
static void printlog(const char *on_what)
{
FILE *fp=NULL;
time_t tt;
if((fp = fopen("/tmp/socket.log", "a"))!=NULL)
{
tt = time(0);
fprintf(fp, "client> %s do: %s\n", asctime(localtime(&tt)), on_what);
}
fclose(fp);
}
int main(int argc, char *argv[])
{
if(argc<3)
{
printf("please input server_ip and port\n");
return -1;
}
FILE *fp=NULL;
time_t tt;
int nbytes;
int ret=0;
struct sockaddr_in server_addr;
int sin_size;
int sfd;
char buf[SIZE] = {0};
printlog("Start client process to server time");
sfd = socket(AF_INET, SOCK_STREAM, 0);
if(-1==sfd)
{
bail("socket()");
}
printlog("Create clent socket");
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(atoi(argv[2]));
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
sin_size = sizeof(server_addr);
ret = connect(sfd, (struct sockaddr*)&server_addr, sin_size);
if(-1==ret)
{
bail("connect()");
}
printlog("client connetc server at address");
printlog(inet_ntoa(server_addr.sin_addr));
nbytes = read(sfd, buf, sizeof(buf));
if(nbytes<=0)
{
bail("read()");
}
printlog("Get time from server");
bzero(buf, sizeof(buf));
if((fp=fopen("/tmp/socket.log", "a"))!=NULL)
{
tt = time(0);
fprintf(fp, "Client: %s get time is: %s\n", asctime(localtime(&tt)), buf);
fclose(fp);
}
close(sfd);
printlog("close client socket");
printf("\n");
return 0;
}