netAddressBits ourIPAddress(UsageEnvironment& env) { static netAddressBits ourAddress = 0; int sock = -1; struct in_addr testAddr; if (ourAddress == 0) { // We need to find our source address struct sockaddr_in fromAddr; fromAddr.sin_addr.s_addr = 0; // Get our address by sending a (0-TTL) multicast packet, // receiving it, and looking at the source address used. // (This is kinda bogus, but it provides the best guarantee // that other nodes will think our address is the same as we do.) do { loopbackWorks = 0; // until we learn otherwise testAddr.s_addr = our_inet_addr("228.67.43.91"); // arbitrary Port testPort(15947); // ditto sock = setupDatagramSocket(env, testPort); if (sock < 0) break; if (!socketJoinGroup(env, sock, testAddr.s_addr)) break; unsigned char testString[] = "hostIdTest"; unsigned testStringLength = sizeof testString; if (!writeSocket(env, sock, testAddr, testPort, 0, testString, testStringLength)) break; unsigned char readBuffer[20]; struct timeval timeout; timeout.tv_sec = 5; timeout.tv_usec = 0; int bytesRead = readSocket(env, sock, readBuffer, sizeof readBuffer, fromAddr, &timeout); if (bytesRead == 0 // timeout occurred || bytesRead != (int)testStringLength || strncmp((char*)readBuffer, (char*)testString, testStringLength) != 0) { break; } loopbackWorks = 1; } while (0); if (!loopbackWorks) do { // We couldn't find our address using multicast loopback // so try instead to look it up directly. char hostname[100]; hostname[0] = '\0'; #ifndef CRIS gethostname(hostname, sizeof hostname); #endif if (hostname[0] == '\0') { env.setResultErrMsg("initial gethostname() failed"); break; } #if defined(VXWORKS) #include <hostLib.h> if (ERROR == (ourAddress = hostGetByName( hostname ))) break; #else struct hostent* hstent = (struct hostent*)gethostbyname(hostname); if (hstent == NULL || hstent->h_length != 4) { env.setResultErrMsg("initial gethostbyname() failed"); break; } // Take the first address that's not bad // (This code, like many others, won't handle IPv6) netAddressBits addr = 0; for (unsigned i = 0; ; ++i) { char* addrPtr = hstent->h_addr_list[i]; if (addrPtr == NULL) break; netAddressBits a = *(netAddressBits*)addrPtr; if (!badAddress(a)) { addr = a; break; } } if (addr != 0) { fromAddr.sin_addr.s_addr = addr; } else { env.setResultMsg("no address"); break; } } while (0); // Make sure we have a good address: netAddressBits from = fromAddr.sin_addr.s_addr; if (badAddress(from)) { char tmp[100]; sprintf(tmp, "This computer has an invalid IP address: 0x%x", (netAddressBits)(ntohl(from))); env.setResultMsg(tmp); from = 0; } ourAddress = from; #endif if (sock >= 0) { socketLeaveGroup(env, sock, testAddr.s_addr); closeSocket(sock); } // Use our newly-discovered IP address, and the current time, // to initialize the random number generator's seed: struct timeval timeNow; gettimeofday(&timeNow, NULL); unsigned seed = ourAddress^timeNow.tv_sec^timeNow.tv_usec; our_srandom(seed); } return ourAddress; }
void ProgBot::say() { writeSocket("PRIVMSG #" + input["room"] + ":" + input["input"] + "\r\n"); }
netAddressBits ourIPAddress(UsageEnvironment& env) { static netAddressBits ourAddress = 0; int sock = -1; struct in_addr testAddr; if (ReceivingInterfaceAddr != INADDR_ANY) { // Hack: If we were told to receive on a specific interface address, then // define this to be our ip address: ourAddress = ReceivingInterfaceAddr; } if (ourAddress == 0) { // We need to find our source address struct sockaddr_in fromAddr; fromAddr.sin_addr.s_addr = 0; // Get our address by sending a (0-TTL) multicast packet, // receiving it, and looking at the source address used. // (This is kinda bogus, but it provides the best guarantee // that other nodes will think our address is the same as we do.) do { loopbackWorks = 0; // until we learn otherwise testAddr.s_addr = our_inet_addr("228.67.43.91"); // arbitrary Port testPort(15947); // ditto sock = setupDatagramSocket(env, testPort); if (sock < 0) break; if (!socketJoinGroup(env, sock, testAddr.s_addr)) break; unsigned char testString[] = "hostIdTest"; unsigned testStringLength = sizeof testString; if (!writeSocket(env, sock, testAddr, testPort, 0, testString, testStringLength)) break; // Block until the socket is readable (with a 5-second timeout): fd_set rd_set; FD_ZERO(&rd_set); FD_SET((unsigned)sock, &rd_set); const unsigned numFds = sock+1; struct timeval timeout; timeout.tv_sec = 5; timeout.tv_usec = 0; int result = select(numFds, &rd_set, NULL, NULL, &timeout); if (result <= 0) break; unsigned char readBuffer[20]; int bytesRead = readSocket(env, sock, readBuffer, sizeof readBuffer, fromAddr); if (bytesRead != (int)testStringLength || strncmp((char*)readBuffer, (char*)testString, testStringLength) != 0) { break; } // We use this packet's source address, if it's good: loopbackWorks = !badAddressForUs(fromAddr.sin_addr.s_addr); } while (0); if (sock >= 0) { socketLeaveGroup(env, sock, testAddr.s_addr); closeSocket(sock); } if (!loopbackWorks) do { // We couldn't find our address using multicast loopback, // so try instead to look it up directly - by first getting our host name, and then resolving this host name char hostname[100]; hostname[0] = '\0'; int result = gethostname(hostname, sizeof hostname); if (result != 0 || hostname[0] == '\0') { env.setResultErrMsg("initial gethostname() failed"); break; } // Try to resolve "hostname" to an IP address: NetAddressList addresses(hostname); NetAddressList::Iterator iter(addresses); NetAddress const* address; // Take the first address that's not bad: netAddressBits addr = 0; while ((address = iter.nextAddress()) != NULL) { netAddressBits a = *(netAddressBits*)(address->data()); if (!badAddressForUs(a)) { addr = a; break; } } // Assign the address that we found to "fromAddr" (as if the 'loopback' method had worked), to simplify the code below: fromAddr.sin_addr.s_addr = addr; } while (0); // Make sure we have a good address: netAddressBits from = fromAddr.sin_addr.s_addr; if (badAddressForUs(from)) { char tmp[100]; sprintf(tmp, "This computer has an invalid IP address: %s", AddressString(from).val()); env.setResultMsg(tmp); from = 0; } ourAddress = from; // Use our newly-discovered IP address, and the current time, // to initialize the random number generator's seed: struct timeval timeNow; gettimeofday(&timeNow, NULL); unsigned seed = ourAddress^timeNow.tv_sec^timeNow.tv_usec; our_srandom(seed); } return ourAddress; }
void *clientManagement(void *context) { char *buffer; int clientFd, threadErr, bytesRead, nLines, index, messageReceived, nSwitches, testRange, mode; unsigned id; pthread_t snmp_thread; //Initializing variables threadErr = 0; bytesRead = 0; nSwitches = 0; nLines = 0; index = 0; mode = 0; testRange = 0; messageReceived = 0; id = *((unsigned int *)context); clientFd = reports[id].sock; buffer = NULL; while (1) { buffer = readSocket(clientFd, 2, 1, &bytesRead); if (strcmp(buffer, CONNECT_REQUEST_MESSAGE) == 0) { printf("CONNECT_REQUEST_MESSAGE\n"); pthread_mutex_lock(&lock); clientsStatuses.connected++; printf("Connected: %d/%d\n", clientsStatuses.connected, clientsStatuses.quantity); if (clientsStatuses.connected == clientsStatuses.quantity) { printf("Broadcasting 'send START_MESSAGE' order\n"); pthread_cond_broadcast(&sendStart); } while(clientsStatuses.connected < clientsStatuses.quantity){ //TODO: Agregar un timeout para enviar el mensaje aun si no estan todos conectados printf("Blocked slave id: %d. of %d\n", clientsStatuses.connected, clientsStatuses.quantity); pthread_cond_wait(&sendStart, &lock); } if (id == clientsStatuses.quantity - 1) { threadErr = pthread_create(&snmp_thread, NULL, &asynchronousSnmp, NULL); if (threadErr) { pthread_join(snmp_thread, NULL); perror("Creating SNMP thread"); exit(1); } } pthread_mutex_unlock(&lock); snprintf(buffer, strlen(START_MESSAGE) + 1, START_MESSAGE); bytesRead = writeSocket(clientFd, buffer, 2, 1); if (bytesRead < 0) { perror("connectReqMessage"); exit(0); } messageReceived++; } else if (strcmp(buffer, REPORT_MESSAGE) == 0) { printf("REPORT_MESSAGE\n"); pthread_mutex_lock(&lock); clientsStatuses.reported++; printf("Reported: %d/%d\n", clientsStatuses.reported, clientsStatuses.quantity); pthread_mutex_unlock(&lock); printf("******** RESULTS *********\n"); //REPORT ENVIRONMENT buffer = readSocketLimiter(clientFd, 5, &bytesRead); nSwitches = atoi(buffer); printf("nSwitches: %d\n", nSwitches); buffer = NULL; buffer = readSocketLimiter(clientFd, 5, &bytesRead); nLines = atoi(buffer); printf("nLines/loops: %d\n", nLines); buffer = NULL; buffer = readSocketLimiter(clientFd, 5, &bytesRead); mode = atoi(buffer); printf("mode: %d\n", mode); buffer = NULL; buffer = readSocketLimiter(clientFd, 5, &bytesRead); testRange = atoi(buffer); printf("testRange: %d\n", testRange); //REPORT DATA bytesRead = plotNode(clientFd, id, nSwitches, nLines, mode, testRange); if (bytesRead > 0) messageReceived++; } else { perror("ERROR unknown message from node"); } if (messageReceived == SERVER_MESSAGES) break; } pthread_mutex_lock(&lock); snmpStop = 1; pthread_mutex_unlock(&lock); if (id == clientsStatuses.quantity - 1) { pthread_join(snmp_thread, NULL); } //displayMessages(mysnmp, SNMP); pthread_exit(NULL); }