Linux UDP EchoServer守护进程编写

平时工作中主要用java,不过还是对Linux非常喜爱,虽然学习时间有限,每天还是能学点小东西,呵呵,写了一个HelloWorld版的Linux守护进程,启动后监听UDP端口做简单的echo back

Server代码


#include<sys/socket.h>
#include<netinet/in.h>
#include<strings.h>
#include<stdio.h>
#include<syslog.h>
#include<stdlib.h>
#include<signal.h>
#include <sys/types.h> /* basic system data types */
#include <sys/socket.h> /* basic socket definitions */
#include <sys/time.h> /* timeval{} for select() */
#include <time.h> /* timespec{} for pselect() */
#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
#include <arpa/inet.h> /* inet(3) functions */
#include <errno.h>
#include <fcntl.h> /* for nonblocking */
#include <netdb.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> /* for S_xxx file mode constants */
#include <sys/uio.h> /* for iovec{} and readv/writev */
#include <unistd.h>
#include <sys/wait.h>
#include <sys/un.h> /* for Unix domain sockets */
int init_deamon(){
pid_t pid;
if((pid=fork())<0){
return (-1);
}else if(pid){
exit(0);
}
if(setsid()<0){
return (-1);
}
signal(SIGHUP,SIG_IGN);
if((pid=fork())<0){
return (-1);
}else if(pid){
exit(0);
}
chdir("/");
int i=0;
for(;i<64;i++){
close(i);
}
open("/dev/null",O_RDONLY);
open("/dev/null",O_RDWR);
open("/dev/null",O_RDWR);
openlog("deamon server start for udp",LOG_PID,0);
syslog(LOG_INFO|LOG_LOCAL2,"Yep,That's me");
return (0);
}
void dg_echo(int sockfd,struct sockaddr *cliaddr,socklen_t clilen){
int n;
socklen_t len;
char str[16];
char msg[1024];
for(;;){
len=clilen;
n=recvfrom(sockfd,msg,1024,0,cliaddr,&clilen);
printf("recv from %s \n",inet_ntop(AF_INET,&cliaddr,str,sizeof(str)));
sendto(sockfd,msg,n,0,cliaddr,clilen);
msg[n]=0;
fputs(msg,stdout);
syslog(LOG_INFO|LOG_LOCAL2,msg);
}
}
int main(int argc,char **argv){
int sockfd;
struct sockaddr_in servaddr,cliaddr;
init_deamon();
sockfd=socket(AF_INET,SOCK_DGRAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(22111);
bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
dg_echo(sockfd,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
}



client 代码


#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<strings.h>
void dg_cli(FILE *fp,int sockfd,struct sockaddr *servaddr,socklen_t servlen){
int n;
socklen_t len;
struct sockaddr *replyaddr;
replyaddr=malloc(servlen);
char readline[1024],sendline[1025];
char str[16];
connect(sockfd,servaddr,servlen);
while(fgets(sendline,1024,fp)!=NULL){
write(sockfd,sendline,strlen(sendline));
n=read(sockfd,readline,1024);
// if(len!=servlen||memcmp(servaddr,replyaddr,len)!=0){
// printf("reply from %s (ignored)\n",inet_ntop(AF_INET,&replyaddr,str,sizeof(str)));
// continue;
// }
readline[n]=0;
fputs(readline,stdout);
}
}
int main(int argc,char **argv){
int sockfd;
struct sockaddr_in servaddr;
if(argc!=2){
printf("usage:udpcli <IPAddress>\n");
exit(1);
}
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(22111);
inet_pton(AF_INET,argv[1],&servaddr.sin_addr);

sockfd=socket(AF_INET,SOCK_DGRAM,0);
dg_cli(stdin,sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

exit(0);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值