daily pastebin goal
63%
SHARE
TWEET

Untitled

a guest Oct 22nd, 2018 64 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include <unistd.h>
  6. //libs padrão para uso da socket
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #include <sys/types.h>
  10. #include <sys/socket.h>
  11. // lib para usar para converter host para ip
  12. #include <netdb.h>
  13.  
  14.  
  15. # define   MAXBUFF 1024
  16. # define   FIM    "fim da transmissao"
  17. client(int socketfd);
  18. int main ()
  19. {
  20. int       socketfd;
  21. char         Porta_servidor[4],ip_address[]="192.168.0.104";
  22. struct sockaddr_in   serv_addr;    //Estrutura de endereco do servidor
  23.  
  24. printf("digite a porta do servidor:");
  25. scanf("%s",Porta_servidor);
  26.  
  27. //Preenche a estrutura "serv_addr" com o endereco do servidor
  28. bzero( (char*) &serv_addr, sizeof(serv_addr));
  29. serv_addr.sin_family        = AF_INET;
  30. serv_addr.sin_addr.s_addr  = inet_addr(ip_address);
  31. serv_addr.sin_port        = htons(atoi(Porta_servidor));
  32.  
  33. //Cria o socket TCP
  34. if ( (socketfd = socket(AF_INET, SOCK_STREAM, 0) ) < 0){
  35. printf("cliente: erro na criacao do socket");
  36. exit(0);
  37. }
  38.  
  39. //Se conecta ao servidor
  40. if (connect(socketfd,(struct sockaddr *)&serv_addr, sizeof(serv_addr))<0){
  41. printf("cliente: erro na conexao com o servidor");
  42. close(socketfd);
  43. exit(0);
  44. }
  45.  
  46. //Chama a funcao cliente para enviar o pedido e receber a resposta
  47. client(socketfd);
  48.  
  49. //Fecha o socket apos uso
  50. close (socketfd);
  51. exit(0);
  52.  
  53. }//Fim main()
  54.  
  55. /*------------------------------------------------------------
  56. Funcao client:  - Envia o numeros ao servidor
  57. /////////////   - Recebe os dados vindos do servidor e
  58. - mostra-os na tela
  59. -------------------------------------------------------------*/
  60. client(int socketfd)
  61.  
  62. {
  63. char      op='';
  64. int    n=0,num1=0,num2=0,resposta=0,flag ;
  65.  
  66. //Envia o nome do arquivo ao servidor
  67. printf("digite o primeiro numero");
  68. scanf("%d",&num1);
  69. printf("digite o operador");
  70. scanf("%s",&op);
  71. printf("digite o segundo numero");
  72. scanf("%d",&num2);
  73.  
  74.  
  75. if (send(socketfd, &num1, sizeof(num1), 0) == -1 ) {
  76. printf("Funcao client: erro no envio do 1 numero ao servidor");
  77. printf("Read error [%d]: %s n", errno, strerror(errno));  
  78. close(socketfd);
  79. exit(0);
  80. }  
  81. if (send(socketfd, &op, sizeof(&op),0) == -1) {
  82. printf("Funcao client: erro no envio do operando ao servidor");
  83. printf("Read error [%d]: %s n", errno, strerror(errno));  
  84. close(socketfd);
  85. exit(0);
  86. }
  87. if (send(socketfd, &num2, sizeof(num2),0) == -1) {
  88. printf("Funcao client: erro no envio do 2 numero ao servidor");
  89. printf("Read error [%d]: %s n", errno, strerror(errno));
  90. close(socketfd);
  91. exit(0);
  92. }
  93. //Le os dados vindos do servidor e escreve-os
  94. //para a saida padrao (video)
  95. n=recv(socketfd,resposta,sizeof(int),0);    
  96. if (n == -1) {
  97. printf("Read error [%d]: %s n", errno, strerror(errno));
  98. printf("Funcao client: erro no recebimento do resultado");
  99. close(socketfd);
  100. exit(0);
  101. }else{
  102. printf("resposta = %d", resposta);
  103. close(socketfd);
  104. exit(0);
  105. }
  106. }//fim funcao client
  107.    
  108. /*
  109. Exemplo de Servidor Multi-thread - SERVIDOR
  110. Laboratorio de Sistemas Operacionais
  111. */
  112. #include <stdio.h>
  113. #include <sys/types.h>
  114. #include <sys/socket.h>
  115. #include <netinet/in.h>
  116. #include <netdb.h>
  117. #include <time.h>
  118. #include <string.h>
  119. #include <stdlib.h>
  120. #include <math.h>
  121.  
  122. #define MAXBUFF 1024
  123. #define FIM     "fim da transmissao"
  124. #define TRUE 1
  125. #define FALSE 0
  126.  
  127. void * NewSocketThread (void *fdnewsock);
  128. int server(int);
  129.  
  130. int main()
  131. {
  132.     int    socketfd, serv_len;
  133.     struct sockaddr_in   serv_addr;
  134.  
  135.     //Cria o socket TCP
  136.     if ( (socketfd = socket(AF_INET, SOCK_STREAM, 0) ) < 0)
  137.     {
  138.         printf("servidor: erro na criacao do socket");
  139.         exit(0);
  140.     }
  141.  
  142.     //Preenche a estrutura do servidor e faz o Bind Local
  143.     bzero( (char*) &serv_addr, sizeof(serv_addr));
  144.     serv_addr.sin_family        = AF_INET;
  145.     serv_addr.sin_addr.s_addr  = htonl(INADDR_ANY);
  146.     serv_addr.sin_port        = htons(1443);
  147.  
  148.     serv_len = sizeof(serv_addr);
  149.     if (bind(socketfd, (struct sockaddr *) &serv_addr, serv_len)<0)
  150.     {
  151.         printf("servidor: erro no bind local");
  152.         close(socketfd);
  153.         exit(0);
  154.     }
  155.  
  156.     //Mostra a porta alocada dinamicamente
  157.     if (getsockname(socketfd, (struct sockaddr *)&serv_addr, &serv_len) < 0)
  158.     {
  159.         printf("servidor: erro na chamada da funcao getsockname");
  160.         close(socketfd);
  161.         exit(0);
  162.     }
  163.  
  164.     printf("nPorta alocada para o Servidor: %dn", ntohs(serv_addr.sin_port));
  165.  
  166.     //Chama a funcao servidor para esperar uma requisicao de servico
  167.  
  168.     server(socketfd);
  169.  
  170.     //fecha o socket apos uso
  171.  
  172.     close (socketfd);
  173.     exit(0);
  174. }
  175.  
  176. /*--------------------------------------------------------------------
  177.  FUNCAO server:  -Conexoes para vários clientes - Servidor Multithread
  178.  //////////////
  179. ---------------------------------------------------------------------*/
  180. int server(int socketfd)
  181. {
  182.     char buff[MAXBUFF];
  183.     int *newsocketfd, cli_len;
  184.     struct sockaddr_in   cli_addr;
  185.     pthread_t *sockthread;
  186.  
  187.     //Prepara para receber conexoes dos clientes
  188.     listen(socketfd,5);
  189.  
  190.     //Estrutura de repetição para continuar recebendo conexões de clientes
  191.     for(;;)
  192.     {
  193.         //Aloca espaço na memória para o novo descritor - newsocketfd
  194.         newsocketfd = (int *)malloc(sizeof(newsocketfd));
  195.         //Aguarda a conexao de algum cliente e quando o cliente conecta, o valor de accept
  196.         //é recebido pelo conteúdo do endereço de newsocketfd (que está alocado na memória)
  197.         cli_len=sizeof(newsocketfd);
  198.         if ((*newsocketfd=accept(socketfd,(struct sockaddr *)&cli_addr,&cli_len))<0)
  199.         {
  200.             printf("Funcao server: erro no accept");
  201.             close(socketfd); //Fecha o socket do servidor
  202.             exit(0);
  203.         }
  204.  
  205.         //Aloca espaço na memória para uma nova thread - sockthread
  206.         sockthread = (pthread_t *)malloc(sizeof(pthread_t));
  207.         //Cria e chama a nova thread(NewSocketThread) para tratar da comunicação do novo
  208.         //cliente, passando como argumento o descritor(newsocketfd) do novo cliente
  209.         pthread_create(sockthread,NULL,NewSocketThread,newsocketfd);
  210.  
  211.     }
  212.  
  213.  
  214. } //Fim Funcao server
  215.  
  216.  
  217. /*--------------------------------------------------------------------------------
  218.  FUNCAO NewSocketThread: -Recebe o descritor do novo cliente.
  219.  //////////////////////  -Le a mensagem enviada pelo cliente e escreve a mesma mensagem
  220.                           para este cliente. Assim cada thread trata da comunicação
  221.                           de leitura e escrita para cada cliente, individualmente.
  222.                           ( 1 thread para 1 cliente )
  223.                          -Enquanto o cliente estiver conectado, a thread correspondente
  224.                           ao descritor deste cliente estará efetuando a comunicação.
  225. ----------------------------------------------------------------------------------*/
  226.  
  227. void * NewSocketThread (void *fdnewsock)
  228. {
  229.  
  230.     int *newsockfd = (int *)fdnewsock;  //cast do tipo void para tipo int *
  231.     char      op;
  232.     int n,num1,num2,resposta;
  233.     //Estrutura de repetição para continuar efetuando leitura e escrita na comunicação
  234.  
  235.     {
  236.         //O servidor le mensagem do cliente "dono" deste descritor
  237.         if(recv(*newsockfd, &num1, sizeof(int), 0) == -1)
  238.             printf("nao recebeu o numero 1");
  239.  
  240.         if(recv(*newsockfd, &op, sizeof(char), 0) == -1)
  241.             printf("nao recebeu o op");
  242.  
  243.         if(recv(*newsockfd, &num2, sizeof(int), 0) == -1)
  244.             printf("nao recebeu o numero 2");
  245.  
  246.         write(1,op,1);
  247.  
  248.         if(op == '+')
  249.         {
  250.             resposta=num1+num2;
  251.             printf ("n O resposta na soma e: %d",resposta);
  252.         }
  253.         else if(op == '-')
  254.         {
  255.             resposta=num1-num2;
  256.             printf ("n O resposta subtração e: %d",resposta);
  257.         }
  258.         else if(op == '/')
  259.         {
  260.             resposta=num1/num2;
  261.             printf ("n O resposta divisao e: %d",resposta);
  262.         }
  263.         else if (op == '*')
  264.         {
  265.             resposta=num1*num2;
  266.             printf ("n O resposta multiplicaçao e: %d",resposta);
  267.         }
  268.  
  269.         //O servidor escreve mensagem no cliente "dono" deste descritor
  270.         send(*newsockfd,&resposta,sizeof(resposta),0);
  271.     }
  272.     }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top