/* Código concorrente de um servidor daytime. Não é o código ideal (deveria tratar * melhor os erros das funções por exemplo) mas é suficiente * para começar a entender como se escreve servidores TCP usando sockets. * * RFC do daytime: http://www.faqs.org/rfcs/rfc867.html * * Prof. Daniel Batista em 24/11/2016. Baseado no código disponibilizado no livro do Stevens * * Bugs? Tente consertar primeiro! Depois me envie email :) batista@ime.usp.br */ #include #include #include #include #include #include #include #include #define MAXLINE 100 #define LISTENQ 1 int main(int argc, char **argv) { int listenfd, connfd; struct sockaddr_in servaddr; char buff[MAXLINE]; time_t ticks; pid_t pid; listenfd = socket(AF_INET, SOCK_STREAM, 0); if (listenfd < 0) { fprintf(stderr,"socket error :(\n"); exit(1); } bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(13); if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ) { fprintf(stderr,"bind error :(\n"); exit(2); } if (listen(listenfd, LISTENQ) < 0) { fprintf(stderr,"listen error :(\n"); exit(3); } for ( ; ; ) { connfd = accept(listenfd, (struct sockaddr *) NULL, NULL); if ((pid = fork()) == 0) { close(listenfd); /* Tudo que já estava sendo feito antes quando não era * concorrente */ if (connfd < 0) fprintf(stderr,"accept error :(\n"); else { ticks = time(NULL); snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks)); if (write(connfd, buff, strlen(buff)) < 0) fprintf(stderr,"write error :(\n"); /* O sleep está aqui só para simular * uma conexão demorada */ sleep(100); close(connfd); exit(0); } } else close(connfd); } exit(0); }