#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
/* Global constants */
#define SERV_UDP_PORT 6543
#define SERV_TCP_PORT 6543
#define SERV_HOST_ADDR "192.168.70.61"
#define MAXLINE 512
char *pname;
int writen(fd, ptr, nbytes)
register int fd;
register char *ptr;
register int nbytes;
{
int nleft, nwritten;
nleft = nbytes;
while (nleft > 0) {
nwritten = write(fd, ptr, nleft);
if (nwritten <= 0)
return(nwritten);
nleft -= nwritten;
ptr += nwritten;
}
return(nbytes - nleft);
}
int readline(fd, ptr, maxlen)
register int fd;
register char *ptr;
register int maxlen;
{
int n, rc;
char c;
for (n = 1; n < maxlen; n++) {
if ((rc = read(fd, &c, 1)) == 1) {
*ptr++ = c;
if (c == '\n')
break;
} else if (rc == 0) {
if (n == 1)
return(0);
else
break;
} else
return(-1);
}
*ptr = 0;
return(n);
}
str_echo(sockfd)
int sockfd;
{
int n;
char line[MAXLINE];
for ( ; ; ) {
n = readline(sockfd, line, MAXLINE);
if (n == 0)
return;
else if (n < 0)
printf("str_echo: readline error \n");
if (writen(sockfd, line, n) != n)
printf("str_echo: writen error \n");
}
}
main(argc,argv)
int argc;
char *argv[];
{
int sockfd, newsockfd, clilen, childpid;
struct sockaddr_in cli_addr,serv_addr;
pname = argv[0];
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("server: Não pode abrir o socket");
exit(1);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(SERV_TCP_PORT);
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
listen(sockfd, 5);
for ( ; ; ) {
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0){
printf("server: accept error \n");
printf("newsockfd = %d \n", newsockfd);
exit(1);
}
if ( (childpid = fork()) < 0)
printf("server: fork error \n");
if (childpid == 0) {
close(sockfd);
sleep(3);
str_echo(newsockfd);
exit(0);
}
close(newsockfd);
}
}