/* C1 Esta rotina recebe uma linha do teclado e envia-a para C2 */ #include #include #include #include #include void main(void) { struct sockaddr_in si1, si2; int sk, l=sizeof(si1); struct hostent *dest; char linha[81], porto[6]; sk=socket(AF_INET,SOCK_DGRAM, 0); si1.sin_family=AF_INET; si1.sin_addr.s_addr=htonl(INADDR_ANY); si1.sin_port=htons(0); bind(sk,(struct sockaddr*)&si1, l); si2.sin_family=AF_INET; printf("Maquina de destino? "); gets(linha); dest=gethostbyname(linha); si2.sin_addr=*(struct in_addr*)*dest->h_addr_list; printf("Porto de destino? "); gets(porto); si2.sin_port=htons(atoi(porto)); do { gets(linha); sendto(sk, linha, 81, 0, (struct sockaddr*)&si2, sizeof(si2)); } while(strcmp(linha, "fim")); close(sk); } ========================================================================= /* C2 Esta rotina recebe uma informação de C1, converte-a para maiúsculas, e envia-a para a C3 */ #include #include #include #include void main(void) { struct sockaddr_in si1, si2, si3; int sk, l=sizeof(si2), i; char linha[81], porto[6]; sk=socket(AF_INET,SOCK_DGRAM, 0); printf("Porto de escuta do broadcast? "); gets(porto); si1.sin_family=AF_INET; si1.sin_addr.s_addr=htonl(INADDR_ANY); si1.sin_port=htons(atoi(porto)); bind(sk,(struct sockaddr*)&si1, l); /* Recebe mensagem de C3 */ do { recvfrom(sk,linha,81,0,(struct sockaddr*)&si3, &l); } while(strcmp(linha,"c3")); printf("Porto de escuta da mensagem? "); gets(porto); close(sk); si1.sin_port=htons(atoi(porto)); sk=socket(AF_INET,SOCK_DGRAM,0); bind(sk,(struct sockaddr*)&si1, l); /* Recebe mensagem de C1, mostra-a, converte-a para maiúsculas e envia-a para C3*/ do { recvfrom(sk, linha, 81, 0, (struct sockaddr*)&si2, &l); printf("%s: %i - %s\n",inet_ntoa(si2.sin_addr), ntohs(si2.sin_port), linha); i=0; while (linha[i] != '\0') {linha[i] = toupper(linha[i]); i++;} sendto(sk, linha, 81, 0, (struct sockaddr*)&si3, sizeof(si3)); } while(strcmp(linha, "FIM")); close(sk); } ========================================================================= /* C3 Esta rotina envia a sua identificação em broadcast. Depois recebe uma informação de C2, mostra-a e converte-a para minúsculas */ #include #include #include #include void main(void) { struct sockaddr_in si1, si2; int sk=socket(AF_INET,SOCK_DGRAM,0); int l=sizeof(si2), i, val=1; char linha[81]="c3", porto[6]; si1.sin_family=AF_INET; si1.sin_addr.s_addr=htonl(INADDR_ANY); printf("Porto de escuta de mensagens? "); gets(porto); si1.sin_port=htons(atoi(porto)); bind(sk,(struct sockaddr*)&si1, sizeof(si1)); setsockopt(sk,SOL_SOCKET, SO_BROADCAST, &val, sizeof(val)); si2.sin_family=AF_INET; si2.sin_addr.s_addr=inet_addr("255.255.255.255"); printf("Porto de envio do broadcast? "); gets(porto); si2.sin_port=htons(atoi(porto)); for(i=0;i<=10;i++) sendto(sk,linha,81,0, (struct sockaddr*)&si2,l); val=0; setsockopt(sk,SOL_SOCKET, SO_BROADCAST, &val, sizeof(val)); bzero((char*)&si2,l); do { recvfrom(sk, linha, 81, 0, (struct sockaddr*)&si2, &l); printf("%s: %i - %s\n",inet_ntoa(si2.sin_addr), ntohs(si2.sin_port), linha); i=0; while (linha[i] != '\0') {linha[i] = tolower(linha[i]); i++;} } while(strcmp(linha, "fim")); close(sk); }