Página 2 de 2 PrimeiroPrimeiro 12
+ Responder ao Tópico



  1. #6
    honae
    Citação Postado originalmente por Anonymous
    Edite seu post e coloque o código entre tags "CODE", assim ele ficará indentado.

    E olhando seu código por cima, notei o seguinte:

    Código :
    int writen(fd, ptr, nbytes)
    register int fd;
    register char *ptr;
    register int nbytes;
    {
        ...
    }

    Isto é um tanto ruim de ler, utilize assim:
    Código :
    int writen(int fd, char *ptr, int nbytes)
    { 
        ...
    }
    Código :
    #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);
     
       }
    }

  2. #7
    honae
    Citação Postado originalmente por Anonymous
    Edite seu post e coloque o código entre tags "CODE", assim ele ficará indentado.

    E olhando seu código por cima, notei o seguinte:

    Código :
    int writen(fd, ptr, nbytes)
    register int fd;
    register char *ptr;
    register int nbytes;
    {
        ...
    }

    Isto é um tanto ruim de ler, utilize assim:
    Código :
    int writen(int fd, char *ptr, int nbytes)
    { 
        ...
    }
    Código :
    #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  "127.0.0.1"
    #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);
     
       }
    }






Tópicos Similares

  1. Programação Visual em Sistemas Linux/UNIX
    Por Hawthorn no fórum Linguagens de Programação
    Respostas: 0
    Último Post: 10-12-2002, 13:49
  2. programação visual
    Por B4D_D0G no fórum Linguagens de Programação
    Respostas: 14
    Último Post: 27-11-2002, 13:27
  3. Programação
    Por B4D_D0G no fórum Linguagens de Programação
    Respostas: 8
    Último Post: 21-11-2002, 11:36
  4. sockets options
    Por no fórum Servidores de Rede
    Respostas: 0
    Último Post: 07-11-2002, 13:49
  5. Programação Web
    Por lalmeida no fórum Linguagens de Programação
    Respostas: 5
    Último Post: 26-09-2002, 08:00

Visite: BR-Linux ·  VivaOLinux ·  Dicas-L