add check go on socket poll, debug list
This commit is contained in:
@@ -272,7 +272,7 @@ GENERATE_LIST_ALL(TYPE_PTR)
|
|||||||
|
|
||||||
#define GEN_HEAD_PTR_LIST(type)\
|
#define GEN_HEAD_PTR_LIST(type)\
|
||||||
void purge_ptr_type_list_##type(struct main_list_##type *var_list);\
|
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;\
|
var_list->current_index = 0;\
|
||||||
free(var_list);\
|
free(var_list);\
|
||||||
}\
|
}\
|
||||||
void free_##type(void *arg)\
|
void free_##type(type arg)\
|
||||||
|
|
||||||
|
|
||||||
GEN_HEAD_PTR_LIST(TYPE_PTR)
|
GEN_HEAD_PTR_LIST(TYPE_PTR)
|
||||||
|
|||||||
+1
-1
@@ -51,7 +51,7 @@ $(PROJECT_LIB): $(OBJ)
|
|||||||
$(YSOCKSRC_O): $(YSOCKSRC) $(YNODESRC_O)
|
$(YSOCKSRC_O): $(YSOCKSRC) $(YNODESRC_O)
|
||||||
$(CC) -o $@ -c $< $(CFLAGS)
|
$(CC) -o $@ -c $< $(CFLAGS)
|
||||||
|
|
||||||
$(YNODESRC_O): $(YNODESRC) $(YSOCKSRC_O) $(YLISTSRC_O)
|
$(YNODESRC_O): $(YNODESRC) $(YLISTSRC_O)
|
||||||
$(CC) -o $@ -c $< $(CFLAGS)
|
$(CC) -o $@ -c $< $(CFLAGS)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "y_socket_t/y_node_t.h"
|
#include "y_socket_t/y_node_t.h"
|
||||||
|
|
||||||
@@ -37,19 +38,40 @@ enum ipVersions{
|
|||||||
|
|
||||||
extern const int af_array[nbIpVersion];//={AF_INET, AF_INET6};
|
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 y_socket_t{
|
||||||
struct pollfd *fds;
|
struct pollfd *fds;
|
||||||
|
size_t size_fds;
|
||||||
char * port;
|
char * port;
|
||||||
struct main_list_y_NODE_T *nodes;
|
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 {
|
struct argdst {
|
||||||
char *port;
|
char *port;
|
||||||
char *addrStr;
|
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);
|
void y_socket_free(struct y_socket_t *socket);
|
||||||
|
|
||||||
|
|||||||
@@ -2,23 +2,85 @@
|
|||||||
|
|
||||||
const int af_array[nbIpVersion]={AF_INET, AF_INET6};
|
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; i<local_size; ++i){
|
||||||
|
cur_str[i]=mstr->current_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));
|
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->port=port;
|
||||||
sock_temp->nodes = create_var_list_y_NODE_T();
|
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;
|
return sock_temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void y_socket_free(struct y_socket_t *socket){
|
void y_socket_free(struct y_socket_t *socket){
|
||||||
free(socket->fds);
|
free(socket->fds);
|
||||||
free_all_var_list_y_NODE_T(socket->nodes);
|
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);
|
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
|
// node = NULL for anyIP or str address of the server
|
||||||
int get_fds_with_getaddrinfo(char *port /*service */, char * node, struct pollfd *fds){
|
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{
|
void update_nodes(y_NODE_T node, struct main_list_y_NODE_T *nodes){
|
||||||
struct pollfd *fds;
|
char host[NI_MAXHOST], service[NI_MAXSERV];
|
||||||
//int size_fds;
|
int status = getnameinfo((struct sockaddr*)&(node.addr), node.addr_len, host, NI_MAXHOST, service, NI_MAXSERV, NI_NUMERICHOST);
|
||||||
char * port ;/*service */
|
if(status)
|
||||||
char * addrDistant;
|
// 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){
|
void send_file_for_all_nodes(struct pollfd *fds, struct main_list_y_NODE_T *nodes, char * filename){
|
||||||
struct get_fds_arg * argSock = (struct get_fds_arg*)arg;
|
char tempAddr[BUF_SIZE];
|
||||||
struct pollfd *fds = argSock->fds;
|
int c_af;
|
||||||
char * port = argSock->port ;
|
// char host[NI_MAXHOST], service[NI_MAXSERV];
|
||||||
char * addrDistant = argSock->addrDistant;
|
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<nread; ++i)
|
||||||
|
if((buf[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){
|
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);
|
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){
|
void *y_pollSocketsFunc(void *arg){
|
||||||
struct y_socket_t * argSock = (struct y_socket_t*)arg;
|
struct y_socket_t * argSock = (struct y_socket_t*)arg;
|
||||||
struct pollfd *fds = argSock->fds;
|
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);
|
y_get_fds_func(fds, argSock->port, NULL);
|
||||||
|
|
||||||
if((fds[v4].fd==-1) || (fds[v6].fd==-1)){
|
if((fds[v4].fd==-1) || (fds[v6].fd==-1)){
|
||||||
@@ -285,18 +326,13 @@ void *y_pollSocketsFunc(void *arg){
|
|||||||
//struct sockaddr_storage peer_addr;
|
//struct sockaddr_storage peer_addr;
|
||||||
//socklen_t len_peer_addr;
|
//socklen_t len_peer_addr;
|
||||||
y_NODE_T node;
|
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;
|
ssize_t nread;
|
||||||
char buf[BUF_SIZE];
|
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];
|
// char msgRet[BUF_SIZE + NI_MAXHOST + NI_MAXSERV + 100];
|
||||||
// int len_msgRet;
|
// int len_msgRet;
|
||||||
for(;;){
|
for(;check_y_socket_go_on(argSock);){
|
||||||
printf("poll: wait events\n");
|
printf("poll: wait events\n");
|
||||||
status = poll(fds, nbIpVersion, -1);
|
status = poll(fds, nbIpVersion, -1);
|
||||||
if(status <= 0){
|
if(status <= 0){
|
||||||
@@ -309,84 +345,46 @@ void *y_pollSocketsFunc(void *arg){
|
|||||||
node.addr_len = sizeof(struct sockaddr_storage);
|
node.addr_len = sizeof(struct sockaddr_storage);
|
||||||
for(af = v4; af<=v6;++af){
|
for(af = v4; af<=v6;++af){
|
||||||
if(fds[af].revents && POLLIN){
|
if(fds[af].revents && POLLIN){
|
||||||
|
remove_all_list_in_y_ptr_STRING(m_str);
|
||||||
memset(buf, 0, BUF_SIZE);
|
memset(buf, 0, BUF_SIZE);
|
||||||
nread = recvfrom(fds[af].fd, buf, BUF_SIZE, 0,
|
while((nread = recvfrom(fds[af].fd, buf, BUF_SIZE, 0,
|
||||||
(struct sockaddr *)&(node.addr), &(node.addr_len));
|
(struct sockaddr *)&(node.addr), &(node.addr_len))) == BUF_SIZE){
|
||||||
if(nread == -1)
|
if(nread == -1)
|
||||||
continue;
|
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';
|
if(buf[nread-1]=='\n') buf[nread-1]='\0';
|
||||||
printf("msg: %s\n",buf);
|
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);
|
||||||
|
|
||||||
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<nread; ++i)
|
|
||||||
if((buf[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 )
|
char *temp_all_buf=NULL;
|
||||||
{
|
/*size_t total_buf = */ copy_list_y_ptr_STRING_to_one_string(temp_all_buf , m_str);
|
||||||
//memset(msgRet, 0, BUF_SIZE + NI_MAXHOST + NI_MAXSERV + 100);
|
|
||||||
// sprintf(msgRet, "from %s:%s =%s",host, service, buf);
|
|
||||||
|
|
||||||
// len_msgRet = strlen(msgRet);
|
//printf("msg : %s\n",buf);
|
||||||
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,*/
|
handler_(temp_all_buf);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close(fd_file);
|
|
||||||
printf("fd=%d closede: filename=%s\n",fd_file,buf);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// printf("nread = %ld: buf=%s\nlen_buf=%ld\ncmp=%d\n",nread,buf,strlen(buf),strncmp(buf,"SHUTDOWN SERVER",15));
|
// 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){
|
if(strncmp(buf,"SHUTDOWN SERVER",15) == 0){
|
||||||
printf("leave poll thread, bye!\n");
|
printf("leave poll thread, bye!\n");
|
||||||
|
break;
|
||||||
|
//return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
#define str(x) # x
|
#define str(x) # x
|
||||||
#define xstr(x) str(x)
|
#define xstr(x) str(x)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user