#include #include #include #define LOCAL_SERVER_PORT 6000 #define MAX_MSG 100 int message_length = 0; void msg_err_exit(char *msg) { fprintf(stderr, msg); system("PAUSE"); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { int sd, sd2, rc, n, cliLen; struct sockaddr_in cliAddr, remoteServAddr, servAddr; char msg[MAX_MSG], value, broadcast_ip[32]; WSADATA wsaData; WSAStartup(MAKEWORD(2,1),&wsaData); LPHOSTENT lpHostEntry; //obtendo o endereço de broadcast da rede printf("IP de broadcast da rede: "); scanf("%s", broadcast_ip); fflush(stdin); /* criando socket de recepção - server */ sd=socket(AF_INET, SOCK_DGRAM, 0); if(sd<0) { printf("valor de sd: %d",sd); printf("%s: cannot open socket \n",argv[0]); exit(1); } /* bind local server port */ servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(LOCAL_SERVER_PORT); rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr)); if(rc<0) { printf("%s: cannot bind port number %d \n", argv[0], LOCAL_SERVER_PORT); exit(1); } printf("%s: waiting for data on port UDP %u\n", argv[0],LOCAL_SERVER_PORT); /* server infinite loop */ while(1) { /* init buffer */ memset(msg,0x0,MAX_MSG); /* receive message */ cliLen = sizeof(cliAddr); n = recvfrom(sd, msg, MAX_MSG, 0, (struct sockaddr *) &cliAddr, &cliLen); if(n<0) { printf("%s: cannot receive data \n",argv[0]); continue; } /* print received message */ printf("%s: from %s:UDP%u : %s \n", argv[0],inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port),msg); //############################################################################ // // criando socket para reenvio dos dados aos clientes // //############################################################################ message_length = strlen(msg); sd2 = socket(AF_INET,SOCK_DGRAM,0); if(sd2<0) { msg_err_exit("não é possivel abrir socket"); } else { puts("socket aberto"); } //criando o socket de retorno para o cliente (socket cliente) /* bind any port */ memset(&remoteServAddr, 0, sizeof(remoteServAddr)); value = '1'; if(setsockopt(sd2,SOL_SOCKET,SO_BROADCAST,&value,sizeof(value)) ==-1) { msg_err_exit("opcao broadcast falhou"); } lpHostEntry = gethostbyname(broadcast_ip); remoteServAddr.sin_family = AF_INET; remoteServAddr.sin_addr.s_addr = htonl(INADDR_ANY); remoteServAddr.sin_port = htons(5000); remoteServAddr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list); message_length = strlen(msg); rc = sendto(sd, msg, message_length, 0, (LPSOCKADDR) &remoteServAddr, sizeof(struct sockaddr)); if(rc<0) { puts("data not send!"); WSACleanup(); closesocket(sd); msg_err_exit("socket() failed\n"); } if(rc<0) { puts("data not send!"); WSACleanup(); closesocket(sd2); msg_err_exit("socket() failed\n"); } closesocket(sd2); //######################################################################## }/* end of server infinite loop */ closesocket(sd); WSACleanup(); return 0; }