diff --git a/list_t/src/list_t/list_t.h b/list_t/src/list_t/list_t.h index 3707b59..7ff7824 100644 --- a/list_t/src/list_t/list_t.h +++ b/list_t/src/list_t/list_t.h @@ -272,7 +272,7 @@ GENERATE_LIST_ALL(TYPE_PTR) #define GEN_HEAD_PTR_LIST(type)\ void purge_ptr_type_list_##type(struct main_list_##type *var_list);\ - void free_##type(void *arg);\ + void free_##type(type arg);\ @@ -292,7 +292,7 @@ GENERATE_LIST_ALL(TYPE_PTR) var_list->current_index = 0;\ free(var_list);\ }\ - void free_##type(void *arg)\ + void free_##type(type arg)\ GEN_HEAD_PTR_LIST(TYPE_PTR) diff --git a/y_socket_t/Makefile b/y_socket_t/Makefile index adc682d..f43f577 100644 --- a/y_socket_t/Makefile +++ b/y_socket_t/Makefile @@ -51,7 +51,7 @@ $(PROJECT_LIB): $(OBJ) $(YSOCKSRC_O): $(YSOCKSRC) $(YNODESRC_O) $(CC) -o $@ -c $< $(CFLAGS) -$(YNODESRC_O): $(YNODESRC) $(YSOCKSRC_O) $(YLISTSRC_O) +$(YNODESRC_O): $(YNODESRC) $(YLISTSRC_O) $(CC) -o $@ -c $< $(CFLAGS) diff --git a/y_socket_t/include/y_socket_t/y_socket_t.h b/y_socket_t/include/y_socket_t/y_socket_t.h index a0f2963..1b1dd20 100644 --- a/y_socket_t/include/y_socket_t/y_socket_t.h +++ b/y_socket_t/include/y_socket_t/y_socket_t.h @@ -19,6 +19,7 @@ #include #include +#include #include "y_socket_t/y_node_t.h" @@ -37,19 +38,40 @@ enum ipVersions{ extern const int af_array[nbIpVersion];//={AF_INET, AF_INET6}; +struct y_string{ + char * buf; + size_t size; +}; + +typedef struct y_string * y_ptr_STRING; + +struct y_string * create_y_ptr_STRING(const char *buf, size_t size); +GENERATE_LIST_ALL(y_ptr_STRING) +GEN_HEAD_PTR_LIST(y_ptr_STRING) + +size_t total_size_list_y_ptr_STRING(struct main_list_y_ptr_STRING *mstr); +size_t copy_list_y_ptr_STRING_to_one_string(char *dst_str, struct main_list_y_ptr_STRING *mstr); + struct y_socket_t{ struct pollfd *fds; + size_t size_fds; char * port; struct main_list_y_NODE_T *nodes; - pthread_mutex_t mut_nodes; + pthread_mutex_t *mut_nodes; + int go_on; + pthread_mutex_t *mut_go_on; }; + +//struct y_socket_t * create_y_socket_t(size_t size_fds, char *port); +//void free_y_socket_t(struct y_socket_t *sock); + struct argdst { char *port; char *addrStr; }; -struct y_socket_t * y_socket_create(char * port); +struct y_socket_t * y_socket_create(char * port, size_t size_fds); void y_socket_free(struct y_socket_t *socket); diff --git a/y_socket_t/src/y_socket_t/y_socket_t.c b/y_socket_t/src/y_socket_t/y_socket_t.c index f05e218..52dfe5c 100644 --- a/y_socket_t/src/y_socket_t/y_socket_t.c +++ b/y_socket_t/src/y_socket_t/y_socket_t.c @@ -2,23 +2,85 @@ const int af_array[nbIpVersion]={AF_INET, AF_INET6}; -struct y_socket_t * y_socket_create(char *port){ +struct y_string * create_y_ptr_STRING(const char *buf, size_t size){ + struct y_string *string=malloc(sizeof(struct y_string)); + string->buf=malloc(size+1); + if(buf){ + strncpy(string->buf, buf, size); + if(strlen(buf)>=size) + string->buf[size]='\0'; + } + string->size=size; + return string; +} + +GEN_FUNC_PTR_LIST_FREE(y_ptr_STRING){ + free(arg->buf); + free(arg); +} + +size_t total_size_list_y_ptr_STRING(struct main_list_y_ptr_STRING *mstr){ + size_t total_size=0; + for(move_current_to_begin_list_y_ptr_STRING(mstr); mstr->current_list; increment_list_y_ptr_STRING(mstr)){ + total_size += mstr->current_list->value->size; + } + return total_size; +} + +size_t copy_list_y_ptr_STRING_to_one_string(char *dst_str, struct main_list_y_ptr_STRING *mstr){ + if(dst_str == NULL){ + dst_str=malloc(total_size_list_y_ptr_STRING(mstr)); + } + char *cur_str = dst_str; + size_t local_size=0; + size_t count_size=0; + for(move_current_to_begin_list_y_ptr_STRING(mstr); mstr->current_list; increment_list_y_ptr_STRING(mstr)){ + local_size = mstr->current_list->value->size; + for(size_t i=0; icurrent_list->value->buf[i]; + } + count_size += local_size; + cur_str = dst_str + count_size; + } + + return count_size; + +} + +struct y_socket_t * y_socket_create(char *port, size_t size_fds){ struct y_socket_t *sock_temp=malloc(sizeof(struct y_socket_t)); - sock_temp->fds = malloc(nbIpVersion * sizeof(struct pollfd)); + if(size_fds>=nbIpVersion) + sock_temp->size_fds = size_fds; + else + sock_temp->size_fds = nbIpVersion; + sock_temp->fds = malloc(sock_temp->size_fds * sizeof(struct pollfd)); sock_temp->port=port; sock_temp->nodes = create_var_list_y_NODE_T(); - pthread_mutex_init(&(sock_temp->mut_nodes), NULL); + sock_temp->mut_nodes = malloc(sizeof(pthread_mutex_t)); + pthread_mutex_init(sock_temp->mut_nodes, NULL); + sock_temp->go_on = 1; + sock_temp->mut_go_on = malloc(sizeof(pthread_mutex_t)); + pthread_mutex_init(sock_temp->mut_go_on, NULL); return sock_temp; } void y_socket_free(struct y_socket_t *socket){ free(socket->fds); free_all_var_list_y_NODE_T(socket->nodes); - pthread_mutex_destroy(&(socket->mut_nodes)); + pthread_mutex_destroy(socket->mut_nodes); + free(socket->mut_nodes); + pthread_mutex_destroy(socket->mut_go_on); + free(socket->mut_go_on); free(socket); } +int check_y_socket_go_on(struct y_socket_t *sock){ + pthread_mutex_lock(sock->mut_go_on); + int ret = sock->go_on; + pthread_mutex_unlock(sock->mut_go_on); + return ret; +} // node = NULL for anyIP or str address of the server int get_fds_with_getaddrinfo(char *port /*service */, char * node, struct pollfd *fds){ /* @@ -99,19 +161,96 @@ int get_fds_with_getaddrinfo(char *port /*service */, char * node, struct pollfd } -struct get_fds_arg{ - struct pollfd *fds; - //int size_fds; - char * port ;/*service */ - char * addrDistant; +void update_nodes(y_NODE_T node, struct main_list_y_NODE_T *nodes){ + char host[NI_MAXHOST], service[NI_MAXSERV]; + int status = getnameinfo((struct sockaddr*)&(node.addr), node.addr_len, host, NI_MAXHOST, service, NI_MAXSERV, NI_NUMERICHOST); + if(status) + // printf("debug: status ==0 : success: Received successfully from %s:%s\n", host,service); + // else + fprintf(stderr, "getnameinfo: %s\n", gai_strerror(status)); + + + if(NULL == search_node_in_list_y_NODE_T(nodes, node)) + push_back_list_y_NODE_T(nodes, node); + +} + +struct send_arg{ + struct pollfd *fd; + struct main_list_y_NODE_T *nodes; + char * filename; }; -/* -void *y_get_fds_func(void *arg){ - struct get_fds_arg * argSock = (struct get_fds_arg*)arg; - struct pollfd *fds = argSock->fds; - char * port = argSock->port ; - char * addrDistant = argSock->addrDistant; -*/ + +void send_file_for_all_nodes(struct pollfd *fds, struct main_list_y_NODE_T *nodes, char * filename){ + char tempAddr[BUF_SIZE]; + int c_af; +// char host[NI_MAXHOST], service[NI_MAXSERV]; + char buf_send[BUF_SIZE]; + int fd_file; + int retread; + + /*int status = getnameinfo((struct sockaddr*)&(node.addr), node.addr_len, host, NI_MAXHOST, service, NI_MAXSERV, NI_NUMERICHOST); + if(status) + // printf("debug: status ==0 : success: Received successfully from %s:%s\n", host,service); + // else + fprintf(stderr, "getnameinfo: %s\n", gai_strerror(status)); + + + if(NULL == search_node_in_list_y_NODE_T(nodes, node)) + push_back_list_y_NODE_T(nodes, node); + */ + /* + //UPPER + for(int i=0; i='a') && (buf[i]<='z')) + buf[i]=buf[i]+'A'-'a';*/ + fd_file = open( filename , O_RDONLY); + if(fd_file == -1){ + fprintf(stderr,"error opening file |%s| for reading\n",filename); + return /*NULL*/; + } + + while((retread = read(fd_file, buf_send, BUF_SIZE) ) > 0 ) + { + //memset(msgRet, 0, BUF_SIZE + NI_MAXHOST + NI_MAXSERV + 100); + // sprintf(msgRet, "from %s:%s =%s",host, service, buf); + + // len_msgRet = strlen(msgRet); + printf("sending response %s :\n",buf_send); + FOR_LIST_FORM_BEGIN(y_NODE_T, nodes){ + c_af=(nodes->current_list->value).addr.ss_family; + //memset(tempAddr, 0, BUF_SIZE); + if(c_af==AF_INET){ + if(NULL == inet_ntop(c_af, + &(GET_IN_type_ADDR(&(nodes->current_list->value),)), + tempAddr, BUF_SIZE/*(argSock->nodes->current_list->value).addr_len*/)){ + fprintf(stderr, "error inet_ntop v4\n"); + } + }else if(c_af==AF_INET6){ + if(NULL == inet_ntop(c_af, + &(GET_IN_type_ADDR(&(nodes->current_list->value),6)), + tempAddr, BUF_SIZE /*(argSock->nodes->current_list->value).addr_len*/)){ + fprintf(stderr, "error inet_ntop v6 :errno=%d\n",errno); + } + } + + if(sendto(fds[(c_af==AF_INET6)].fd, + buf_send, retread, + /*msgRet, len_msgRet,*/ + 0, + (struct sockaddr*)&((nodes->current_list->value).addr), + (nodes->current_list->value).addr_len) != + retread + /*len_msgRet*/ + ){ + fprintf(stderr, "Error sending response to %s\n",tempAddr); + }else + printf("sending response to %s\n",tempAddr); + } + } + close(fd_file); + printf("fd=%d closed: filename=%s\n",fd_file,filename); +} void y_get_fds_func(struct pollfd * fds, char * port, char * addrDistant){ @@ -170,112 +309,14 @@ void y_get_fds_func(struct pollfd * fds, char * port, char * addrDistant){ freeaddrinfo(result); -// ssize_t nread; -// char buf[BUF_SIZE]; - -// int status, af; -// status = get_fds_with_getaddrinfo(argSock->port, NULL, fds); - -// if(status != 0) - /* - if(status == 1) - fprintf(stderr, " v4 or v6 not listening, we leave!"); - else - fprintf(stderr, " not enough allocatation for fds, we leave!"); - */ - - /* - if((fds[v4].fd==-1) || (fds[v6].fd==-1)){ - fprintf(stderr, " v4 or v6 not listening, we leave!"); - return NULL; - }*/ - -// return fds; - } - +void handler_(char * buf){ + printf("%s\n",buf); +} void *y_pollSocketsFunc(void *arg){ struct y_socket_t * argSock = (struct y_socket_t*)arg; struct pollfd *fds = argSock->fds; -/* - fds[v4].fd=-1; fds[v4].events = POLLIN; - fds[v6].fd=-1; fds[v6].events = POLLIN; - - struct addrinfo hints, *result, *rp; - int status; - ssize_t nread; - char buf[BUF_SIZE]; - - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = AF_UNSPEC; // Allow all IPv4 and IPv6 - hints.ai_socktype = SOCK_DGRAM; // udp - hints.ai_flags = AI_PASSIVE; // anyIP - // - hints.ai_protocol = 0; - hints.ai_canonname = NULL; - hints.ai_addr = NULL; - hints.ai_next = NULL; - - status = getaddrinfo(NULL, argSock->port, &hints, &result); - if(status != 0){ - fprintf(stderr, "getaddrinfo :%s\n", gai_strerror(status)); - return NULL; - } - int af, optValueV6 = 1; - - for(rp = result; rp != NULL; rp=rp->ai_next){ - for(af=v4; af<=v6; ++af){ - if((rp->ai_family == af_array[af]) && (fds[af].fd ==-1)){ - fds[af].fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); - if(fds[af].fd == -1) - continue; -// android -#ifdef IPV6_V6ONLY - if(af == v6){ - if(setsockopt(fds[af].fd, IPPROTO_IPV6, IPV6_V6ONLY, - &optValueV6, sizeof(optValueV6)) == -1){ - perror("error setsockopt v6 :"); - close(fds[af].fd); - fds[af].fd = -1; - continue; - } - } -#endif - if(bind(fds[af].fd, rp->ai_addr, rp->ai_addrlen)==-1){ - close(fds[af].fd); - fds[af].fd=-1; - } - } - } - } - - freeaddrinfo(result); - -*/ - -// ssize_t nread; -// char buf[BUF_SIZE]; - -// int status, af; -// status = get_fds_with_getaddrinfo(argSock->port, NULL, fds); - -// if(status != 0) - /* - if(status == 1) - fprintf(stderr, " v4 or v6 not listening, we leave!"); - else - fprintf(stderr, " not enough allocatation for fds, we leave!"); - */ - -// struct get_fds_arg argGET_addr, *arg_get;//=malloc(sizeof(struct get_fds_arg) ); -// arg_get = &argGET_addr; -// arg_get->fds = fds; -// arg_get->addrDistant = NULL; -// arg_get->port = argSock->port; -// fds = (struct pollfd*) y_get_fds_func(arg_get); - -// fds = (struct pollfd*) y_get_fds_func(fds, argSock->port, NULL); if((fds[v4].fd==-1) || (fds[v6].fd==-1)){ @@ -285,18 +326,13 @@ void *y_pollSocketsFunc(void *arg){ //struct sockaddr_storage peer_addr; //socklen_t len_peer_addr; y_NODE_T node; - char tempAddr[BUF_SIZE]; - int c_af; - char host[NI_MAXHOST], service[NI_MAXSERV]; - char buf_send[BUF_SIZE]; - int fd_file; - int retread; - int af, status; + int af, status; ssize_t nread; char buf[BUF_SIZE]; + struct main_list_y_ptr_STRING *m_str=create_var_list_y_ptr_STRING(); // char msgRet[BUF_SIZE + NI_MAXHOST + NI_MAXSERV + 100]; // int len_msgRet; - for(;;){ + for(;check_y_socket_go_on(argSock);){ printf("poll: wait events\n"); status = poll(fds, nbIpVersion, -1); if(status <= 0){ @@ -309,83 +345,45 @@ void *y_pollSocketsFunc(void *arg){ node.addr_len = sizeof(struct sockaddr_storage); for(af = v4; af<=v6;++af){ if(fds[af].revents && POLLIN){ + remove_all_list_in_y_ptr_STRING(m_str); memset(buf, 0, BUF_SIZE); - nread = recvfrom(fds[af].fd, buf, BUF_SIZE, 0, - (struct sockaddr *)&(node.addr), &(node.addr_len)); - if(nread == -1) - continue; - if(buf[nread-1]=='\n') buf[nread-1]='\0'; -printf("msg : %s\n",buf); - - status = getnameinfo((struct sockaddr*)&(node.addr), node.addr_len, host, NI_MAXHOST, service, NI_MAXSERV, NI_NUMERICHOST); - if(status == 0) - printf("Received %ld bytes from %s:%s\n",(long)nread, host,service); - else - fprintf(stderr, "getnameinfo: %s\n", gai_strerror(status)); - - - if(NULL == search_node_in_list_y_NODE_T(argSock->nodes, node)) - push_back_list_y_NODE_T(argSock->nodes, node); - - /* - //UPPER - for(int i=0; i='a') && (buf[i]<='z')) - buf[i]=buf[i]+'A'-'a';*/ - fd_file = open( buf , O_RDONLY); - if(fd_file == -1){ - fprintf(stderr,"error opening file |%s| for reading\n",buf); - return NULL; - } - - while((retread = read(fd_file, buf_send, BUF_SIZE) ) > 0 ) - { - //memset(msgRet, 0, BUF_SIZE + NI_MAXHOST + NI_MAXSERV + 100); - // sprintf(msgRet, "from %s:%s =%s",host, service, buf); - - // len_msgRet = strlen(msgRet); - printf("sending response %s :\n",buf_send); - FOR_LIST_FORM_BEGIN(y_NODE_T, argSock->nodes){ - c_af=(argSock->nodes->current_list->value).addr.ss_family; - //memset(tempAddr, 0, BUF_SIZE); - if(c_af==AF_INET){ - if(NULL == inet_ntop(c_af, - &(GET_IN_type_ADDR(&(argSock->nodes->current_list->value),)), - tempAddr, BUF_SIZE/*(argSock->nodes->current_list->value).addr_len*/)){ - fprintf(stderr, "error inet_ntop v4\n"); - } - }else if(c_af==AF_INET6){ - if(NULL == inet_ntop(c_af, - &(GET_IN_type_ADDR(&(argSock->nodes->current_list->value),6)), - tempAddr, BUF_SIZE /*(argSock->nodes->current_list->value).addr_len*/)){ - fprintf(stderr, "error inet_ntop v6 :errno=%d\n",errno); - } - } - - if(sendto(fds[(c_af==AF_INET6)].fd, - buf_send, retread, - /*msgRet, len_msgRet,*/ - 0, - (struct sockaddr*)&((argSock->nodes->current_list->value).addr), - (argSock->nodes->current_list->value).addr_len) != - retread - /*len_msgRet*/ - ){ - fprintf(stderr, "Error sending response to %s\n",tempAddr); - }else - printf("sending response to %s\n",tempAddr); - } + while((nread = recvfrom(fds[af].fd, buf, BUF_SIZE, 0, + (struct sockaddr *)&(node.addr), &(node.addr_len))) == BUF_SIZE){ + if(nread == -1) + fprintf(stderr,"error recvfrom\n"); + else{ + y_ptr_STRING y_buf = create_y_ptr_STRING(buf, nread); + push_back_list_y_ptr_STRING(m_str, y_buf); + } + } + if(nread > 0 && nread < BUF_SIZE){ + if(buf[nread-1]=='\n') buf[nread-1]='\0'; + printf("msg: %s\n",buf); + y_ptr_STRING y_buf = create_y_ptr_STRING(buf, nread); + push_back_list_y_ptr_STRING(m_str, y_buf); + } - close(fd_file); - printf("fd=%d closede: filename=%s\n",fd_file,buf); + + char *temp_all_buf=NULL; + /*size_t total_buf = */ copy_list_y_ptr_STRING_to_one_string(temp_all_buf , m_str); + +//printf("msg : %s\n",buf); + + /// + /// + handler_(temp_all_buf); + + /// } } // printf("nread = %ld: buf=%s\nlen_buf=%ld\ncmp=%d\n",nread,buf,strlen(buf),strncmp(buf,"SHUTDOWN SERVER",15)); if(strncmp(buf,"SHUTDOWN SERVER",15) == 0){ printf("leave poll thread, bye!\n"); - return NULL; + break; + //return NULL; } } + return NULL; } #define str(x) # x #define xstr(x) str(x)