+ Responder ao Tópico



  1. #1
    honae
    Visitante

    Padrão Programação Socket

    PessoALL,

    estou tentado fazer com que um programa servidor execute um comando enviado por um programa cliente e retorne o resultado do comando para o cliente.

    o código do prograga servidor segue abaixo. Por enquanto ele só envia a mesma palavra que o cliente manda. Se alguém tiver alguma idéia, por favor me ajude.

    #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;
    char * novo;

    line = malloc(MAXLINE * sizeof(char));

    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. #2
    Visitante

    Padrão Programação Socket

    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)
    { 
        ...
    }



  3. #3

    Padrão Programação Socket

    Desculpe, o post acima foi meu.

  4. #4
    xoomz
    Visitante

    Padrão Programação Socket - dúvida

    Desculpe honae mas não entendi qual o problema que está enfrentando..



  5. #5
    honae
    Visitante

    Padrão Re: Programação Socket - dúvida

    Citação Postado originalmente por xoomz
    Desculpe honae mas não entendi qual o problema que está enfrentando..
    quero que esse pequeno programa funcione tipo um telnet.

  6. #6
    honae
    Visitante

    Padrão Programação Socket

    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);
     
       }
    }



  7. #7
    honae
    Visitante

    Padrão Programação Socket

    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);
     
       }
    }