Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <sys/param.h>
- #include <netinet/in.h>
- #include <string.h>
- #include <stdlib.h>
- //#define SERV_HOST_ADDR "127.0.0.1"
- //#define SERV_HOST_ADDR "172.16.0.2"
- /*O porto deve ser definido na Makefile */
- //#ifndef SERV_UDP_PORT
- //#define SERV_UDP_PORT 6000
- //#endif */
- #define BUFFERSIZE 4096
- #define TIMEOUT 10
- void Abort(char *msg);
- /*________________________________ main ________________________________________
- */
- int main(int argc,char *argv[]){
- fd_set fdread,fdtemp;
- struct timeval timeout={TIMEOUT,0};
- int sockfd, msg_len, dest_port, result, nbytes;
- char *dest_port_c;
- struct sockaddr_in serv_addr;
- char buffer[BUFFERSIZE];
- if(argc!=4){ /*Testa sintaxe*/
- fprintf(stderr,"Sintaxe: %s frase_a_enviar ip_destino porto_destino\n",argv[0]);
- exit(EXIT_FAILURE);
- }
- /*================ ABRE SOCKET PARA CONTACTAR O SERVIDOR ================*/
- /*Abre socket UDP da familia INTERNET
- PF_INET => familia de protocolos da Internet (ARPA)
- SOCK_DGRAM => semantica da comunicacao (connectionless)
- UDP => tipo de protocolo usado (User Datagram Protocol)
- nota:O tipo de protocolo usado, em geral, nao e' especificado (i.e.
- e' passado 0 neste argumento). Tal deve-se a que, geralmente,
- cada familia de protocolos apenas possui um protocolo para cada
- semantica de comunicacao. O conjunto de protocolos pode encontrar
- -se no ficheiro "/etc/protocols"
- */
- if((sockfd=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP))<0)
- Abort("Impossibilidade de criar socket");
- /*================= PREENCHE ENDERECO DO SERVIDOR ====================*/
- bzero((char*)&serv_addr,sizeof(serv_addr)); /*a zero todos os bytes*/
- serv_addr.sin_family=AF_INET; /*Address Family - Internet*/
- serv_addr.sin_addr.s_addr=inet_addr(argv[2]); /*IP => 32 bits*/
- dest_port=atoi(argv[3]);
- serv_addr.sin_port=htons(dest_port); /* Porto well-known */
- /*====================== ENVIA MENSAGEM AO SERVIDOR ==================*/
- msg_len=strlen(argv[1]);
- if(sendto(sockfd,argv[1],msg_len,0,(struct sockaddr*)&serv_addr,
- sizeof(serv_addr)) != msg_len)
- Abort("SO nao conseguiu aceitar o datagram");
- printf("<CLI1>Mensagem enviada ... Aguardando confirmacao.\n");
- FD_ZERO(&fdread); //coloca a zero o todos os bits do fdread
- FD_SET(sockfd, &fdread);
- fdtemp=fdread;
- result=select(sockfd+1,&fdtemp,NULL,NULL,&timeout);
- switch(result){
- case -1:
- printf("Erro na rotina select\n");
- break;
- case 0:
- printf("Timeout!\n");
- break;
- default:
- if(FD_ISSET(sockfd, &fdtemp)){
- /*========================== ESPERA CONFIRMACAO =======================*/
- nbytes=recvfrom(sockfd,buffer,sizeof(buffer),0,NULL,NULL);
- if(nbytes<0) Abort("Impossibilidade de receber confirmacao");
- buffer[nbytes]=0; /*termina com NULL a confirmacao rebebida*/
- printf("<CLI1>Confirmacao recebida {%s}.\n",buffer);
- }
- }
- /*=========================== FECHA SOCKET ============================*/
- close(sockfd);
- exit(EXIT_SUCCESS);
- }
- /*________________________________ Abort________________________________________
- Mostra a mensagem de erro associada ao ultimo erro no SO e abando com
- "exit status" a 1
- _______________________________________________________________________________
- */
- void Abort(char *msg){
- fprintf(stderr,"\a<CLI1>Erro fatal: <%s>\n",msg);
- exit(EXIT_FAILURE);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement