//目的,實現遠程擷取伺服器uptime輸出
//伺服器
#include<stdio.h>#include<stdlib.h>#include<sys/socket.h>#include<arpa/inet.h>#include<string.h>#include<errno.h>#include<unistd.h>#define BUFSIZE 1024int main(void){ struct sockaddr_in local_addr,remote_addr; int sockfd; int server_ip,nrecv; int alen; FILE *fp; char buffer[BUFSIZE]; memset(&local_addr,0,sizeof(local_addr)); local_addr.sin_family=AF_INET; local_addr.sin_port=htons(5666); inet_pton(AF_INET,"127.0.0.1",(void*)&server_ip); local_addr.sin_addr.s_addr=server_ip; sockfd=socket(AF_INET,SOCK_DGRAM,0); if(bind(sockfd,(struct sockaddr*)&local_addr,sizeof(struct sockaddr))<0){ fprintf(stderr,"error:bind() error!\n"); exit(-1); } printf("====================Begin to service====================\n"); while(1){ if((nrecv=recvfrom(sockfd,buffer,BUFSIZE,0,(struct sockaddr*)&remote_addr,&alen))<0){ fprintf(stderr,"error:%s\n",strerror(errno)); exit(1); }else{ if((fp=popen("/usr/bin/uptime","r"))==NULL){ fprintf(stderr,"error:%s\n",strerror(errno)); exit(1); } if(fgets(buffer,BUFSIZE,fp)!=NULL) sendto(sockfd,buffer,strlen(buffer),0,(struct sockaddr*)&remote_addr,alen); } } exit(0);}
//用戶端
#include<stdio.h>#include<stdlib.h>#include<sys/socket.h>#include<arpa/inet.h>#include<syslog.h>#include<unistd.h>#include<errno.h>#include<string.h>#define BUFSIZE 1024int main(void){ int sockfd; struct sockaddr_in server_addr; char buffer[BUFSIZE]; int server_ip; int nrecv; int alen; memset(&server_addr,0,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(5666); inet_pton(AF_INET,"127.0.0.1",(void*)&server_ip); server_addr.sin_addr.s_addr=server_ip; sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd<0){ syslog(LOG_ERR,"ruptime_udp:socket() failed!\n"); exit(1); } memset(buffer,0,BUFSIZE); buffer[0]=0; alen=sizeof(struct sockaddr); if(sendto(sockfd,buffer,1,0,(struct sockaddr*)&server_addr,sizeof(struct sockaddr))<0){ syslog(LOG_ERR,"ruptime_udp error:%s\n",strerror(errno)); exit(1); } if((nrecv=recvfrom(sockfd,buffer,BUFSIZE,0,(struct sockaddr*)&server_addr,&alen))>=0) write(STDOUT_FILENO,buffer,nrecv); exit(0);}
//運行結果
13:15:11 up 5:13, 4 users, load average: 0.00, 0.00, 0.00