Archivio dei sorgenti</a>
</li>
</ul>
+ <p>
+ Se poi volete proprio una versione cartacea, ho messo a
+ disposizione la guida su lulu.com, che fornisce un servizio di
+ stampa a richiesta; al momento è disponibile solo la versione
+ completa dalla guida, all'indirizzo:
+ <ul>
+ <li>
+ <a href="http://www.lulu.com/content/612937">
+ Versione Completa
+ </a>
+ </li>
+ </ul>
+ si tenga presente che per sua natura questa tenderà a variare
+ parecchio, essendo la guida in costante sviluppo. </p>
+ <p>
+ Il costo in più della versione stampata (ed anche quello del
+ download, che comunque potrete effettuare gratis da qui) sarà
+ usato come supporto allo sviluppo: mi impegno ad aggiungere due
+ pagine alla guida (che per mancanza di tempo riesco a sviluppare
+ sempre meno) per ogni copia acquistata.</p>
+ <p>
+ A breve seguirà, per quanti preferiscono avere un libro il cui
+ contenuto non subisce aggiornamente radicali ogni settimana, la
+ pubblicazione della prima parte della guida, che a quel punto non
+ dovrebbe subire variazioni rilevanti essendo sostanzialmente
+ completa.</p>
+
</td>
</tr>
<tr>
* Variables definition
*/
int list_fd, conn_fd;
- int waiting = 0;
- int keepalive = 0;
int reuse = 0;
int compat = 0;
pid_t pid;
*/
int i;
opterr = 0; /* don't want writing to stderr */
- while ( (i = getopt(argc, argv, "hkrdicw:")) != -1) {
+ while ( (i = getopt(argc, argv, "hrdic")) != -1) {
switch (i) {
/*
* Handling options
case 'i':
demonize = 0;
break;
- case 'k':
- keepalive = 1;
- break;
case 'r':
reuse = 1;
break;
case 'd':
debugging = 1;
break;
- case 'w':
- waiting = strtol(optarg, NULL, 10);
- break;
case '?': /* unrecognized options */
printf("Unrecognized options -%c\n",optopt);
usage();
SignalRestart(SIGCHLD, HandSigCHLD); /* restarting handler */
}
/* create and bind socket */
- if ( (list_fd = sockbindopt(argv[optind], "echo", 6,
+ if ( (list_fd = sockbindopt(argv[optind], "1234", 6,
SOCK_STREAM, reuse)) < 0) {
return 1;
}
PrintErr("listen error");
exit(1);
}
- if (waiting) sleep(waiting);
/* handle echo to client */
while (1) {
/* accept connection */
}
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);
if (demonize) {
* routine to print usage info and exit
*/
void usage(void) {
- printf("A counter server\n");
+ printf("Elementary connection counter server\n");
printf("Usage:\n");
printf(" countd [-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");
exit(1);
}
-/*
- * routine to handle echo for connection
- */
-void ServEcho(int sockfd) {
- char buffer[MAXLINE];
- int nread, nwrite;
- char debug[MAXLINE+20];
- /* main loop, reading 0 char means client close connection */
- while ( (nread = read(sockfd, buffer, MAXLINE)) != 0) {
- if (nread < 0) {
- PrintErr("Errore in lettura");
- return;
- }
- nwrite = FullWrite(sockfd, buffer, nread);
- if (nwrite) {
- PrintErr("Errore in scrittura");
- return;
- }
- if (debugging) {
- buffer[nread] = 0;
- snprintf(debug, MAXLINE+20, "Letti %d byte, %s", nread, buffer);
- if (demonize) { /* daemon mode */
- syslog(LOG_DEBUG, debug);
- } else {
- printf("%s", debug);
- }
- }
- }
- return;
-}
/*
* routine to print error on stout or syslog
*/
return;
}
-
-#define MAXLINE 80
-#define BACKLOG 10
-/* Program begin */
-void usage(void);
-int main(int argc, char *argv[])
-{
-/*
- * Variables definition
- */
- int list_fd, conn_fd;
- int i;
- struct sockaddr_in serv_add;
- char buffer[MAXLINE];
- time_t timeval;
- /*
- * Input section: decode parameters passed in the calling
- * Use getopt function
- */
- opterr = 0; /* don't want writing to stderr */
- while ( (i = getopt(argc, argv, "h")) != -1) {
- switch (i) {
- /*
- * Handling options
- */
- case 'h':
- printf("Wrong -h option use\n");
- usage();
- return(0);
- break;
- case '?': /* unrecognized options */
- printf("Unrecognized options -%c\n",optopt);
- usage();
- default: /* should not reached */
- usage();
- }
- }
- /* ***********************************************************
- *
- * Options processing completed
- *
- * Main code beginning
- *
- * ***********************************************************/
- /* create socket */
- if ( (list_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- perror("Socket creation error");
- exit(-1);
- }
- /* initialize address */
- memset((void *)&serv_add, 0, sizeof(serv_add)); /* clear server address */
- serv_add.sin_family = AF_INET; /* address type is INET */
- serv_add.sin_port = htons(13); /* daytime port is 13 */
- serv_add.sin_addr.s_addr = htonl(INADDR_ANY); /* connect from anywhere */
- /* bind socket */
- if (bind(list_fd, (struct sockaddr *)&serv_add, sizeof(serv_add)) < 0) {
- perror("bind error");
- exit(-1);
- }
- /* listen on socket */
- if (listen(list_fd, BACKLOG) < 0 ) {
- perror("listen error");
- exit(-1);
- }
- /* write daytime to client */
- while (1) {
- if ( (conn_fd = accept(list_fd, (struct sockaddr *) NULL, NULL)) <0 ) {
- perror("accept error");
- exit(-1);
- }
- timeval = time(NULL);
- snprintf(buffer, sizeof(buffer), "%.24s\r\n", ctime(&timeval));
- if ( (write(conn_fd, buffer, strlen(buffer))) < 0 ) {
- perror("write error");
- exit(-1);
- }
- close(conn_fd);
- }
-
- /* normal exit */
- exit(0);
-}
-/*
- * routine to print usage info and exit
- */
-void usage(void) {
- printf("Simple daytime server\n");
- printf("Usage:\n");
- printf(" daytimed [-h] \n");
- printf(" -h print this help\n");
- exit(1);
-}