nmux: MSG_NOSIGNAL fixed client close
This commit is contained in:
parent
dd51b9cc04
commit
1712c5af3b
2 changed files with 11 additions and 10 deletions
20
nmux.cpp
20
nmux.cpp
|
@ -189,7 +189,6 @@ int main(int argc, char* argv[])
|
||||||
//Is there a new client connection?
|
//Is there a new client connection?
|
||||||
if( FD_ISSET(listen_socket, &select_fds) && ((new_socket = accept(listen_socket, (struct sockaddr*)&addr_cli, &addr_cli_len)) != -1) )
|
if( FD_ISSET(listen_socket, &select_fds) && ((new_socket = accept(listen_socket, (struct sockaddr*)&addr_cli, &addr_cli_len)) != -1) )
|
||||||
{
|
{
|
||||||
select_ret--;
|
|
||||||
if(NMUX_DEBUG) fprintf(stderr, "mainfor: accepted (socket = %d).\n", new_socket);
|
if(NMUX_DEBUG) fprintf(stderr, "mainfor: accepted (socket = %d).\n", new_socket);
|
||||||
//Close all finished clients
|
//Close all finished clients
|
||||||
for(int i=0;i<clients.size();i++)
|
for(int i=0;i<clients.size();i++)
|
||||||
|
@ -197,10 +196,18 @@ int main(int argc, char* argv[])
|
||||||
if(clients[i]->status == CS_THREAD_FINISHED)
|
if(clients[i]->status == CS_THREAD_FINISHED)
|
||||||
{
|
{
|
||||||
if(NMUX_DEBUG) fprintf(stderr, "mainfor: client removed: %d\n", i);
|
if(NMUX_DEBUG) fprintf(stderr, "mainfor: client removed: %d\n", i);
|
||||||
client_erase(clients[i]);
|
//client destructor
|
||||||
|
pool->remove_thread(clients[i]->tsmthread);
|
||||||
clients.erase(clients.begin()+i);
|
clients.erase(clients.begin()+i);
|
||||||
|
i--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(NMUX_DEBUG)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "\x1b[33mmainfor: clients now: ");
|
||||||
|
for(int i=0;i<clients.size();i++) fprintf(stderr, "0x%x ", (unsigned)clients[i]);
|
||||||
|
fprintf(stderr, "\x1b[0m\n");
|
||||||
|
}
|
||||||
|
|
||||||
//We're the parent, let's create a new client and initialize it
|
//We're the parent, let's create a new client and initialize it
|
||||||
client_t* new_client = new client_t;
|
client_t* new_client = new client_t;
|
||||||
|
@ -263,11 +270,6 @@ int main(int argc, char* argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void client_erase(client_t* client)
|
|
||||||
{
|
|
||||||
pool->remove_thread(client->tsmthread);
|
|
||||||
}
|
|
||||||
|
|
||||||
void* client_thread (void* param)
|
void* client_thread (void* param)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "client 0x%x: started!\n", (unsigned)param);
|
fprintf(stderr, "client 0x%x: started!\n", (unsigned)param);
|
||||||
|
@ -318,7 +320,7 @@ void* client_thread (void* param)
|
||||||
|
|
||||||
//Read data from global tsmpool and write it to client socket
|
//Read data from global tsmpool and write it to client socket
|
||||||
if(NMUX_DEBUG) fprintf(stderr, "client 0x%x: sending...", (unsigned)param);
|
if(NMUX_DEBUG) fprintf(stderr, "client 0x%x: sending...", (unsigned)param);
|
||||||
ret = send(this_client->socket, pool_read_buffer + client_buffer_index, lpool->size - client_buffer_index, 0);
|
ret = send(this_client->socket, pool_read_buffer + client_buffer_index, lpool->size - client_buffer_index, MSG_NOSIGNAL);
|
||||||
if(NMUX_DEBUG) fprintf(stderr, "client sent.\n");
|
if(NMUX_DEBUG) fprintf(stderr, "client sent.\n");
|
||||||
if(ret == -1)
|
if(ret == -1)
|
||||||
{
|
{
|
||||||
|
@ -332,8 +334,8 @@ void* client_thread (void* param)
|
||||||
}
|
}
|
||||||
|
|
||||||
client_thread_exit:
|
client_thread_exit:
|
||||||
this_client->status = CS_THREAD_FINISHED;
|
|
||||||
fprintf(stderr, "client 0x%x: CS_THREAD_FINISHED, client_goto_source = %d, errno = %d", (unsigned)param, client_goto_source, errno);
|
fprintf(stderr, "client 0x%x: CS_THREAD_FINISHED, client_goto_source = %d, errno = %d", (unsigned)param, client_goto_source, errno);
|
||||||
|
this_client->status = CS_THREAD_FINISHED;
|
||||||
pthread_exit(NULL);
|
pthread_exit(NULL);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
1
nmux.h
1
nmux.h
|
@ -39,7 +39,6 @@ typedef struct client_s
|
||||||
|
|
||||||
void print_exit(const char* why);
|
void print_exit(const char* why);
|
||||||
void sig_handler(int signo);
|
void sig_handler(int signo);
|
||||||
void client_erase(client_t* client);
|
|
||||||
void* client_thread (void* param);
|
void* client_thread (void* param);
|
||||||
void error_exit(const char* why);
|
void error_exit(const char* why);
|
||||||
void maxfd(int* maxfd, int fd);
|
void maxfd(int* maxfd, int fd);
|
||||||
|
|
Loading…
Reference in a new issue