Now we seem to have a proper server that correctly closes clients.
This commit is contained in:
parent
7bae8b1ad8
commit
cb1b6ac8e2
2 changed files with 26 additions and 13 deletions
38
ddcd.cpp
38
ddcd.cpp
|
@ -51,6 +51,12 @@ int set_nonblocking(int fd)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int proc_exists(pid_t pid)
|
||||||
|
{
|
||||||
|
if(pid==0 || pid==1) return 1;
|
||||||
|
return kill(pid, 0) != -1;
|
||||||
|
}
|
||||||
|
|
||||||
client_t* this_client;
|
client_t* this_client;
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
|
@ -119,13 +125,12 @@ int main(int argc, char* argv[])
|
||||||
if( listen(listen_socket, 10) == -1 )
|
if( listen(listen_socket, 10) == -1 )
|
||||||
error_exit(MSG_START "cannot listen() on socket.\n");
|
error_exit(MSG_START "cannot listen() on socket.\n");
|
||||||
|
|
||||||
|
fprintf(stderr,MSG_START "listening on %s:%d\n", inet_ntoa(addr_host.sin_addr), host_port);
|
||||||
|
|
||||||
struct sockaddr_in addr_cli;
|
struct sockaddr_in addr_cli;
|
||||||
socklen_t addr_cli_len = sizeof(addr_cli);
|
socklen_t addr_cli_len = sizeof(addr_cli);
|
||||||
int new_socket;
|
int new_socket;
|
||||||
|
|
||||||
//The server will wait on these sockets later...
|
|
||||||
|
|
||||||
|
|
||||||
//Set stdin and listen_socket to non-blocking
|
//Set stdin and listen_socket to non-blocking
|
||||||
if(set_nonblocking(STDIN_FILENO) || set_nonblocking(listen_socket))
|
if(set_nonblocking(STDIN_FILENO) || set_nonblocking(listen_socket))
|
||||||
error_exit(MSG_START "cannot set_nonblocking().\n");
|
error_exit(MSG_START "cannot set_nonblocking().\n");
|
||||||
|
@ -200,13 +205,20 @@ int main(int argc, char* argv[])
|
||||||
if(write(clients[i]->pipefd[1], buf, retval)==-1)
|
if(write(clients[i]->pipefd[1], buf, retval)==-1)
|
||||||
{
|
{
|
||||||
|
|
||||||
if(!clients[i]->error) print_client(clients[i], "lost buffer, failed to write pipe");
|
if(!clients[i]->error)
|
||||||
else clients[i]->error=1;
|
{
|
||||||
|
print_client(clients[i], "lost buffer, failed to write pipe.");
|
||||||
|
clients[i]->error=1;
|
||||||
|
}
|
||||||
//fprintf(stderr, MSG_START "errno is %d\n", errno); //usually 11
|
//fprintf(stderr, MSG_START "errno is %d\n", errno); //usually 11
|
||||||
int wpstatus;
|
//int wpstatus;
|
||||||
int wpresult = waitpid(clients[i]->pid, &wpstatus, WNOHANG);
|
//int wpresult = waitpid(clients[i]->pid, &wpstatus, WNOHANG);
|
||||||
if(wpresult == -1) print_client(clients[i], "error while waitpid()!");
|
//fprintf(stderr, MSG_START "pid is %d\n",clients[i]->pid);
|
||||||
else if(wpresult == 0)
|
//perror("somethings wrong");
|
||||||
|
//if(wpresult == -1) print_client(clients[i], "error while waitpid()!");
|
||||||
|
//else if(wpresult == 0)
|
||||||
|
waitpid(clients[i]->pid, NULL, WNOHANG);
|
||||||
|
if(!proc_exists(clients[i]->pid))
|
||||||
{
|
{
|
||||||
//Client exited!
|
//Client exited!
|
||||||
print_client(clients[i], "closing client from main process.");
|
print_client(clients[i], "closing client from main process.");
|
||||||
|
@ -214,10 +226,10 @@ int main(int argc, char* argv[])
|
||||||
close(clients[i]->socket);
|
close(clients[i]->socket);
|
||||||
delete clients[i];
|
delete clients[i];
|
||||||
clients.erase(clients.begin()+i);
|
clients.erase(clients.begin()+i);
|
||||||
print_client(clients[i], "okay.");
|
print_client(clients[i], "done closing client from main process.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else clients[i]->error=0;
|
else { if(clients[i]->error) print_client(clients[i], "pipe okay again."); clients[i]->error=0; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//TODO: at the end, server closes pipefd[1] for client
|
//TODO: at the end, server closes pipefd[1] for client
|
||||||
|
@ -229,7 +241,7 @@ int main(int argc, char* argv[])
|
||||||
|
|
||||||
void print_client(client_t* client, const char* what)
|
void print_client(client_t* client, const char* what)
|
||||||
{
|
{
|
||||||
fprintf(stderr,MSG_START " (client %s:%d) %s\n", inet_ntoa(client->addr.sin_addr), client->addr.sin_port, what);
|
fprintf(stderr,MSG_START "(client %s:%d) %s\n", inet_ntoa(client->addr.sin_addr), client->addr.sin_port, what);
|
||||||
}
|
}
|
||||||
|
|
||||||
void client_cleanup()
|
void client_cleanup()
|
||||||
|
@ -245,7 +257,7 @@ void client()
|
||||||
read(this_client->pipefd[0],buf,bufsizeall);
|
read(this_client->pipefd[0],buf,bufsizeall);
|
||||||
if(send(this_client->socket,buf,bufsizeall,0)==-1)
|
if(send(this_client->socket,buf,bufsizeall,0)==-1)
|
||||||
{
|
{
|
||||||
print_client(this_client, "closing.");
|
print_client(this_client, "client process is exiting.");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
1
ddcd.h
1
ddcd.h
|
@ -29,3 +29,4 @@ typedef struct client_s
|
||||||
void client();
|
void client();
|
||||||
void error_exit(const char* why);
|
void error_exit(const char* why);
|
||||||
void print_client(client_t* client, const char* what);
|
void print_client(client_t* client, const char* what);
|
||||||
|
int proc_exists(pid_t pid);
|
||||||
|
|
Loading…
Reference in a new issue