#include #include #include #include #include #include #define REMOTE_SERVER_PORT 6000 #define PORT_SERVER 5000 #define EXIT_CALL_STRING "#quit" char message[128]; int message_length = 0, n; char remote_ip[32], msg[100]; void msg_err_exit(char *msg) { fprintf(stderr, msg); system("PAUSE"); exit(EXIT_FAILURE); } int main(int argc, char **argv) { int sd, sd2, rc, i, cliLen, tecla; struct sockaddr_in cliAddr, remoteServAddr, servAddr; WSADATA wsaData; LPHOSTENT lpHostEntry; //Obtendo ip de broadcast da rede printf("IP de broadcast da rede: "); scanf("%s", remote_ip); fflush(stdin); WSAStartup(MAKEWORD(2,0),&wsaData); lpHostEntry = gethostbyname(remote_ip); if (lpHostEntry == NULL) { msg_err_exit("servidor não encontrado"); } /* socket creation */ sd = socket(AF_INET,SOCK_DGRAM,0); if(sd<0) { msg_err_exit("não é possivel abrir socket"); } /* bind any port */ memset(&remoteServAddr, 0, sizeof(remoteServAddr)); //############################################## //# //# Preparando o socket de envio para o servidor //# //################################################ cliAddr.sin_family = AF_INET; cliAddr.sin_addr.s_addr = htonl(INADDR_ANY); cliAddr.sin_port = htons(0); remoteServAddr.sin_family = AF_INET; remoteServAddr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);// ^ Server's address remoteServAddr.sin_port = htons(REMOTE_SERVER_PORT); // Port number from command line //############################################### //# //# preparando socket de recepção (server) na porta 5000 //# //############################################### sd2=socket(AF_INET, SOCK_DGRAM, 0); if(sd2<0) { printf("valor de sd: %d",sd); printf("%s: cannot open socket \n",argv[0]); system("PAUSE"); exit(1); } /* bind local server port */ servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(PORT_SERVER); rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr)); if(rc<0) { printf("%s: cannot bind port number %d \n", argv[0], PORT_SERVER); system("PAUSE"); exit(1); } printf("waiting for data on port UDP 5000\n"); //############################################### //# //# laço de repetição - envia e espera retorno do servidor. //# //############################################### do { printf("msg: "); gets(message); fflush(stdin); message_length = strlen(message); //################# enviando mensagem rc = sendto(sd, message, message_length, 0, (LPSOCKADDR) &remoteServAddr, sizeof(struct sockaddr)); if(rc<0) { puts("data not send!"); WSACleanup(); closesocket(sd); msg_err_exit("socket() failed\n"); } //#################recebendo mensagem memset(msg,0x0,100); cliLen = sizeof(cliAddr); n = recvfrom(sd, msg, 100, 0, (struct sockaddr *) &cliAddr, &cliLen); if(n<0) { printf("%s: cannot receive data \n",argv[0]); continue; } printf("servidor -- >> : %s \n", msg); //################################################################## //fim do laço }while(strcmp(message, EXIT_CALL_STRING)); WSACleanup(); closesocket(sd); system("PAUSE"); return 0; }