Guest User

Untitled

a guest
Oct 22nd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.91 KB | None | 0 0
  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. }
Add Comment
Please, Sign In to add comment