Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.54 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <sys/param.h>
  6. #include <netinet/in.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9.  
  10.  
  11. //#define SERV_HOST_ADDR "127.0.0.1"
  12. //#define SERV_HOST_ADDR "172.16.0.2"
  13. /*O porto deve ser definido na Makefile */
  14. //#ifndef SERV_UDP_PORT
  15. //#define SERV_UDP_PORT 6000
  16. //#endif */
  17.  
  18. #define BUFFERSIZE 4096
  19. #define TIMEOUT 10
  20.  
  21. void Abort(char *msg);
  22.  
  23. /*________________________________ main ________________________________________
  24. */
  25.  
  26. int main(int argc,char *argv[]){
  27.  
  28. fd_set fdread,fdtemp;
  29. struct timeval timeout={TIMEOUT,0};
  30. int sockfd, msg_len, dest_port, result, nbytes;
  31. char *dest_port_c;
  32. struct sockaddr_in serv_addr;
  33. char buffer[BUFFERSIZE];
  34.  
  35.  
  36. if(argc!=4){ /*Testa sintaxe*/
  37. fprintf(stderr,"Sintaxe: %s frase_a_enviar ip_destino porto_destino\n",argv[0]);
  38. exit(EXIT_FAILURE);
  39. }
  40.  
  41. /*================ ABRE SOCKET PARA CONTACTAR O SERVIDOR ================*/
  42. /*Abre socket UDP da familia INTERNET
  43. PF_INET => familia de protocolos da Internet (ARPA)
  44. SOCK_DGRAM => semantica da comunicacao (connectionless)
  45. UDP => tipo de protocolo usado (User Datagram Protocol)
  46. nota:O tipo de protocolo usado, em geral, nao e' especificado (i.e.
  47. e' passado 0 neste argumento). Tal deve-se a que, geralmente,
  48. cada familia de protocolos apenas possui um protocolo para cada
  49. semantica de comunicacao. O conjunto de protocolos pode encontrar
  50. -se no ficheiro "/etc/protocols"
  51. */
  52. if((sockfd=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP))<0)
  53. Abort("Impossibilidade de criar socket");
  54.  
  55.  
  56. /*================= PREENCHE ENDERECO DO SERVIDOR ====================*/
  57. bzero((char*)&serv_addr,sizeof(serv_addr)); /*a zero todos os bytes*/
  58. serv_addr.sin_family=AF_INET; /*Address Family - Internet*/
  59. serv_addr.sin_addr.s_addr=inet_addr(argv[2]); /*IP => 32 bits*/
  60. dest_port=atoi(argv[3]);
  61. serv_addr.sin_port=htons(dest_port); /* Porto well-known */
  62.  
  63.  
  64. /*====================== ENVIA MENSAGEM AO SERVIDOR ==================*/
  65. msg_len=strlen(argv[1]);
  66. if(sendto(sockfd,argv[1],msg_len,0,(struct sockaddr*)&serv_addr,
  67. sizeof(serv_addr)) != msg_len)
  68. Abort("SO nao conseguiu aceitar o datagram");
  69.  
  70.  
  71. printf("<CLI1>Mensagem enviada ... Aguardando confirmacao.\n");
  72.  
  73. FD_ZERO(&fdread); //coloca a zero o todos os bits do fdread
  74. FD_SET(sockfd, &fdread);
  75. fdtemp=fdread;
  76. result=select(sockfd+1,&fdtemp,NULL,NULL,&timeout);
  77. switch(result){
  78. case -1:
  79. printf("Erro na rotina select\n");
  80. break;
  81. case 0:
  82. printf("Timeout!\n");
  83. break;
  84. default:
  85. if(FD_ISSET(sockfd, &fdtemp)){
  86. /*========================== ESPERA CONFIRMACAO =======================*/
  87. nbytes=recvfrom(sockfd,buffer,sizeof(buffer),0,NULL,NULL);
  88. if(nbytes<0) Abort("Impossibilidade de receber confirmacao");
  89. buffer[nbytes]=0; /*termina com NULL a confirmacao rebebida*/
  90. printf("<CLI1>Confirmacao recebida {%s}.\n",buffer);
  91. }
  92. }
  93. /*=========================== FECHA SOCKET ============================*/
  94. close(sockfd);
  95.  
  96. exit(EXIT_SUCCESS);
  97.  
  98. }
  99.  
  100.  
  101. /*________________________________ Abort________________________________________
  102. Mostra a mensagem de erro associada ao ultimo erro no SO e abando com
  103. "exit status" a 1
  104. _______________________________________________________________________________
  105. */
  106. void Abort(char *msg){
  107. fprintf(stderr,"\a<CLI1>Erro fatal: <%s>\n",msg);
  108. exit(EXIT_FAILURE);
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement