#include #include #include #include #include #include #include #include #include #include #include #include #define SOCKET_PATH "/tmp/._timer_sock.socket" using namespace std; enum MessageType { MT_STOP, MT_STATUS, MT_WAYPOINT }; void recvall(unsigned int sock,char *buf,int num){ int ret,acc=0; do { ret=recv(sock,buf+acc,num-acc,0); if(ret==-1){ perror("recv"); exit(1); } if(ret==0){ //peer closed its side close(sock); exit(1); } acc+=ret; } while(acc> &waypoints,string desc){ time_t tim=time(NULL); waypoints.push_back({tim,desc}); char *buf=ctime(&tim); buf[strlen(buf)-1]='\0'; cout<<"Added waypoint on "<len1?false:strcmp(str+len1-len2,suffix)==0; } void unlink_socketpath(void){ unlink(SOCKET_PATH); } void sendwaypoints(unsigned int sock,vector> &waypoints){ stringstream ss; for(pair &p : waypoints){ char *buf=ctime(&p.first); buf[strlen(buf)-1]='\0'; ss<>24); buf[1]=0xff&(len>>16); buf[2]=0xff&(len>>8); buf[3]=0xff&len; sendall(sock,buf,4); sendall(sock,s.c_str(),len); } unsigned int getclientsock(void){ unsigned int s; struct sockaddr_un remote; s=socket(AF_UNIX,SOCK_STREAM,0); if(s==(unsigned int)-1){ perror("socket"); exit(1); } remote.sun_family=AF_UNIX; strcpy(remote.sun_path,SOCKET_PATH); if(connect(s,(struct sockaddr*)&remote,strlen(SOCKET_PATH)+1+sizeof(remote.sun_family))==-1){ perror("connect"); exit(1); } return s; } void act_server(int numargs,char **args){ //args == argv+1, numargs == argc-1 vector> waypoints; if(numargs){ stringstream ss; for(int i=0;i256){ close(s2); continue; } recvall(s2,buf,msglen); switch(buf[0]){ case MT_STOP: addwaypoint(waypoints,"Stop"); buf[0]=1; sendall(s2,buf,1); sendwaypoints(s2,waypoints); close(s2); close(s); exit(0); case MT_STATUS: buf[0]=1; sendall(s2,buf,1); sendwaypoints(s2,waypoints); break; case MT_WAYPOINT: addwaypoint(waypoints,string(buf+1,msglen-1)); buf[0]=1; sendall(s2,buf,1); break; default: buf[0]=0; sendall(s2,buf,1); break; } } } void act_client_timerstop(void){ unsigned int s=getclientsock(); char buf[5]; buf[0]=0; buf[1]=0; buf[2]=0; buf[3]=1; buf[4]=MT_STOP; sendall(s,buf,5); recvall(s,buf,1); if(buf[0]!=1){ cerr<<"Didn't receive acknowledgement from server!"<