rendered paste body// author OBLiQUE// copyleft 2009// client skeleton// p0wnbox.com// compile it with: gcc client.c -lpthread -o client#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <sys/un.h>#include <signal.h>#include <pthread.h>#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 fdpthread_t twrite, tread; // thread for write function and for read functionint 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}