*/
int list_fd, conn_fd;
int waiting = 0;
+ int keepalive = 0;
+ int reuse = 0;
int compat = 0;
pid_t pid;
- struct sockaddr_in serv_add, cli_add;
+ struct sockaddr_in cli_add;
socklen_t len;
char debug[MAXLINE], ipaddr[20];
/*
*/
int i;
opterr = 0; /* don't want writing to stderr */
- while ( (i = getopt(argc, argv, "hdicw:")) != -1) {
+ while ( (i = getopt(argc, argv, "hkrdicw:")) != -1) {
switch (i) {
/*
* Handling options
case 'i':
demonize = 0;
break;
+ case 'k':
+ keepalive = 1;
+ break;
+ case 'r':
+ reuse = 1;
+ break;
case 'c':
compat = 1;
break;
SignalRestart(SIGCHLD, HandSigCHLD); /* restarting handler */
}
/* create and bind socket */
- if ( (list_fd = sockbind(argv[optind], "echo", 6, SOCK_STREAM)) < 0) {
- if (errno) perror("Socket creation error");
+ if ( (list_fd = sockbindopt(argv[optind], "echo", 6,
+ SOCK_STREAM, reuse)) < 0) {
return 1;
}
/* release privileges and go daemon */
}
if (pid == 0) { /* child */
close(list_fd); /* close listening socket */
+ if (keepalive) { /* enable keepalive ? */
+ setsockopt(conn_fd, SOL_SOCKET, SO_KEEPALIVE,
+ &keepalive, sizeof(keepalive));
+ }
ServEcho(conn_fd); /* handle echo */
if (debugging) {
snprintf(debug, MAXLINE, "Closed connection %s\n", ipaddr);
printf(" echod [-h] \n");
printf(" -h print this help\n");
printf(" -d write debug info\n");
+ printf(" -k enable SO_KEEPALIVE\n");
+ printf(" -r enable SO_REUSEADDR\n");
printf(" -i use interactively\n");
printf(" -c disable BSD semantics\n");
printf(" -w N wait N sec. before calling accept\n");