// author OBLiQUE // copyleft 2009 // client skeleton // p0wnbox.com // compile it with: gcc client.c -lpthread -o client #include #include #include #include #include #include #include #define MAX_STRING 0xfff #define DAEMON_SOCKET_PATH "/tmp/daemon_stream_socket" #define CLIENT_SOCKET_PATH "/tmp/client_socket_" int connect_daemon(const char *daemon_socket_path); void *thread_write(void *args); void *thread_read(void *args); int fd; // socket fd pthread_t twrite, tread; // thread for write function and for read function int main(int argc,char *argv[]) { fd = connect_daemon(DAEMON_SOCKET_PATH); // connection to daemon pthread_create(&twrite,NULL,thread_write,NULL); // start write thread pthread_create(&tread,NULL,thread_read,NULL); // start read thread pthread_join(tread,NULL); // wait read thread to finish return EXIT_SUCCESS; } int connect_daemon(const char *daemon_socket_path) { int sockfd; struct sockaddr_un un; char socket_path[strlen(CLIENT_SOCKET_PATH)+10]; // create new socket to connect to the daemon if ((sockfd=socket(AF_UNIX,SOCK_STREAM,0))<0) // open domain stream socket return -1; sprintf(socket_path,"%s%d",CLIENT_SOCKET_PATH,getpid()); // create the filename unlink(socket_path); // delete the file memset(&un,0,sizeof(un)); // initialize un to 0 un.sun_family=AF_UNIX; // set the socket family // copy client socket path to un strncpy(un.sun_path,socket_path,sizeof(un.sun_path)-1); if (bind(sockfd,(struct sockaddr*)&un,sizeof(un))<0) // assing address to scoket return -1; // connect to daemon memset(&un,0,sizeof(un)); un.sun_family=AF_UNIX; // copy daemon socket path to un strncpy(un.sun_path,daemon_socket_path,sizeof(un.sun_path)-1); if (connect(sockfd,(struct sockaddr*)&un,sizeof(un))<0) // connect to daemon return -1; return sockfd; // return the fd } void *thread_write(void *args) { char buf[MAX_STRING]; int readlen; printf("send anything to the daemon\n\n"); while(1) { readlen=read(STDIN_FILENO,buf,MAX_STRING); // read from stdin buf[readlen-1]='\0'; // remove the \n send(fd,buf,readlen,0); // send to daemon } } void *thread_read(void *args) { int recvlen; char buf[MAX_STRING]; do { recvlen=recv(fd,buf,MAX_STRING,0); // receive from daemon if (recvlen<=0) break; printf("%s\n",buf); } while (recvlen>0); if (recvlen<0) printf("recv() error\n"); close(fd); // close the socket pthread_kill(twrite,SIGTERM); // kill write thread }