📄 myptop.cxx
字号:
#include <sys/socket.h>#include <errno.h>#include <strings.h>#include <stdio.h>#include <stdlib.h>#include <netdb.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include <string.h>int ptop_tcp_open(char *host,char *service,int port);int ptop_write_message(int fd,char *ptr,int nbytes);int tel_read(int fd,char *ptr,int nbytes);int myreadn(int fd,char *ptr,int nbytes);void ctrlchandler(int);int targetstatus_test(char *target_name);int ptop_write_message(int fd,char *ptr,int nbytes){ int nleft,nwritten; nleft=nbytes; while(nleft>0) { nwritten=write(fd,ptr,nleft); if(nwritten<0) return(nwritten); nleft-=nwritten; ptr+=nwritten; } return(nbytes-nleft);}int ptop_tcp_open(char *host,char *service,int port){ int value=targetstatus_test(host); if(value!=0) { printf("the target host %s is not available!\n",host); return -1; } int fd; unsigned long inaddr; struct servent *sp; struct hostent *hp; struct sockaddr_in tcp_ser_addr; struct servent tcp_serv_info; struct hostent tcp_host_info; bzero((char*)&tcp_ser_addr,sizeof(tcp_ser_addr)); tcp_ser_addr.sin_family=AF_INET; tcp_ser_addr.sin_port=htons(port);/*caller's value*/ inaddr=inet_addr(host); if(inaddr!=INADDR_NONE) { bcopy((char*)&inaddr,(char*)&tcp_ser_addr.sin_addr,sizeof(inaddr)); tcp_host_info.h_name=NULL; } else { hp=gethostbyname(host); if(hp==NULL) { perror("tcp_open:host name error"); printf("host name is %s",host); return(-1); } } tcp_host_info=*hp; //printf("(char*)hp->h_addr=%s \n",(char*)hp->h_addr); bcopy((char*)hp->h_addr,(char*)&tcp_ser_addr.sin_addr,hp->h_length); fd=socket(AF_INET,SOCK_STREAM,0); if(fd<0) { perror("tcp_open:can't create a TCP socket"); return(-1); } //printf("connect before......fd=%d host=%s \n",fd,host); if(connect(fd,(struct sockaddr*)&tcp_ser_addr,sizeof(tcp_ser_addr))<0) { perror("tcp_open: can't connet to server"); return(-1); } //printf("connect after......fd=%d host=%s \n",fd,host); return(fd);}int tel_read(int fd,char *ptr,int nbytes){ int n; again: if((n=myreadn(fd,ptr,nbytes))<0) { if(errno==EINTR) { errno=0; goto again; } return -1; } return n;}int myreadn(int fd,char *ptr,int nbytes){ int nleft,nread;nleft=nbytes; while(nleft>0) { nread=recv(fd,ptr,nleft,0); //printf("nread === %d fd=%d \n",nread,fd); if(nread<0) return -1; else if(nread==0) break; nleft-=nread; ptr+=nread; } return(nbytes-nleft);}int srv_accept(int fd,struct sockaddr *cli_addr,int *clilen,char* descr){ int newfd,len; again: len=sizeof(*cli_addr); clilen=&len; newfd=accept(fd,(struct sockaddr*)cli_addr,clilen); if(newfd<0) { if(errno==EINTR) { errno=0; goto again; } //cout<<descr<<": accept error"<<endl; printf("descr= %s ,: accept error\n",descr); return(-1); } return newfd;}int srv_init(char *service,int port,char* descr){ int fd,bufsize; struct servent *sp; struct sockaddr_in ser_addr; struct servent serv_info; struct hostent host_info; bzero((char*)&ser_addr,sizeof(ser_addr)); ser_addr.sin_family=AF_INET; ser_addr.sin_addr.s_addr=htonl(INADDR_ANY); if(service!=NULL) { if((sp=getservbyname("sysmonitor","tcp"))==NULL) { //cout<<descr<<": I cannt't found service "<<service<<" in /etc/services file !!! "<<endl; printf("descr= %s ,:I cannt't found service =%s in /etc/services file !!!\n",descr,service); return -1; } serv_info=*sp; if(port>0) ser_addr.sin_port=htons(port); else ser_addr.sin_port=sp->s_port; //printf("ser_addr.sin_port= %d \n",ser_addr.sin_port); } else { if(port<=0) { //cout<<descr<<": must spesify ether service or port"<<endl; printf("descr = %s must spesify ether service or port \n",descr); return -1; } ser_addr.sin_port=htons(port); } if((fd=socket(AF_INET,SOCK_STREAM,0))<0) { //cout<<descr<<": can't create a socket"<<endl; printf("descr=%s : can't create a socket\n",descr); close(fd); return -1; } //printf("server --- fd = %d \n",fd); bufsize=131072; int secs = 300; if(setsockopt(fd,SOL_SOCKET,SO_SNDBUF,&bufsize,sizeof(bufsize))<0) printf("descr=%s : setsockopt err\n",descr); if(setsockopt(fd,SOL_SOCKET,SO_RCVBUF,&bufsize,sizeof(bufsize))<0) printf("descr=%s : setsockopt err1\n",descr);#ifndef __linux__ if(setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,&bufsize,sizeof(bufsize))<0)#endif if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&bufsize,sizeof(bufsize))<0) perror("Set Reuse error in rs_loop"); if(setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,&secs,sizeof(secs)) < 0) printf("descr=%s : setsockopt err3\n",descr); if(bind(fd,(struct sockaddr*)&ser_addr,sizeof(ser_addr))<0) { printf("descr=%s : bind err\n",descr); if(errno==EADDRINUSE) printf("descr The specified address is already in use\n",descr); close(fd); return -1; } listen(fd,8); return fd;}int Select_socket_status( int socketfd ){ int sockfd; fd_set rset,wset; struct timeval tval; int status; sockfd=socketfd; FD_ZERO(&rset); FD_SET(sockfd,&rset); wset = rset; tval.tv_sec = 1; tval.tv_usec = 0; status=select(FD_SETSIZE,&rset,(fd_set *)0,(fd_set *)0,&tval); //printf("------99999999999999status=%d\n",status); if(status<0) { printf("------status=%d socketfd=%d \n",status,socketfd); if(status ==-1) { return(-1); } else if(status ==-2) { close(socketfd); return(-2); } else { printf("the status'value is %d \n",status); return(-3); } } return(status);}int Select_socket_status1( int socketfd , int flag){ int sockfd; fd_set rset,wset; struct timeval tval; int status; sockfd=socketfd; FD_ZERO(&rset); FD_SET(sockfd,&rset); wset = rset; tval.tv_sec = 1; tval.tv_usec = 0; if(flag==0)//read polling { status=select(FD_SETSIZE,&rset,(fd_set *)0,(fd_set *)0,&tval); //printf("------99999999999999read status=%d\n",status); } else { status=select(FD_SETSIZE,(fd_set *)0,&rset,(fd_set *)0,&tval); //printf("------99999999999999write status=%d\n",status); } if(status<0) { printf("------status=%d socketfd=%d \n",status,socketfd); if(status ==-1) { return(-1); } else if(status ==-2) { close(socketfd); return(-2); } else { printf("the status'value is %d \n",status); return(-3); } } return(status);}int targetstatus_test(char *target_name){ int value=-1; char command[1][100]; bzero(command[0],100); sprintf(command[0],"ping -I 1 %s 100 -n 2 -m 1",target_name); value = system(command[0]); return value;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -