Witam,
Program jaki napisałem wygląda tak:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/tree.h>
#include <libxml/parser.h>
#include <my_global.h>
#include <mysql.h>
#include <sys/time.h>
#define TEMP_PORT 6666
#define LOAD_PORT 6667
int id = 0;
static void saveTemp(char *cpu)
{
MYSQL *conn;
struct timeval tv;
gettimeofday(&tv, NULL);
conn = mysql_init(NULL);
if(conn == NULL)
{
printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
}
if(mysql_real_connect(conn, "localhost", "amokuser", "amokuser", "amok", 3306, NULL, 0) == NULL)
{
printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
}
char* stmt_pattern = "INSERT INTO temps VALUES(DEFAULT, %d, %s, %d)";
char* stmt = (char *)malloc((strlen(stmt_pattern) + strlen(cpu)) * sizeof(char) + 2 * sizeof(int));
sprintf(stmt, stmt_pattern, id, cpu, (int)tv.tv_sec);
mysql_real_query(conn, stmt, strlen(stmt));
free(stmt);
mysql_close(conn);
}
static void saveLoad(char *load)
{
MYSQL *conn;
struct timeval tv;
gettimeofday(&tv, NULL);
conn = mysql_init(NULL);
if(conn == NULL)
{
printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
}
if(mysql_real_connect(conn, "localhost", "amokuser", "amokuser", "amok", 3306, NULL, 0) == NULL)
{
printf("Error %u: %s\n", mysql_errno(conn), mysql_error(conn));
}
char* stmt_pattern = "INSERT INTO loads VALUES(DEFAULT, %d, %s, %d)";
char* stmt = (char *)malloc((strlen(stmt_pattern) + strlen(load)) * sizeof(char) + 2 * sizeof(int));
sprintf(stmt, stmt_pattern, id, load, (int)tv.tv_sec);
mysql_real_query(conn, stmt, strlen(stmt));
free(stmt);
mysql_close(conn);
}
static void get_element_names(xmlNode *a_node)
{
xmlNode *cur_node = NULL;
for(cur_node = a_node; cur_node; cur_node = cur_node->next)
{
if(cur_node->type == XML_ELEMENT_NODE && xmlStrcmp(cur_node->name, (const xmlChar *)"CPU") == 0)
{
char* cpu = (char*)malloc((strlen(xmlNodeGetContent(cur_node))) * sizeof(char));
sprintf(cpu, (char *)xmlNodeGetContent(cur_node));
saveTemp(cpu);
free(cpu);
}
if(cur_node->type == XML_ELEMENT_NODE && xmlStrcmp(cur_node->name, (const xmlChar *)"load") == 0)
{
char* load = (char *)malloc((strlen(xmlNodeGetContent(cur_node))) * sizeof(char));
sprintf(load, (char *)xmlNodeGetContent(cur_node));
saveLoad(load);
free(load);
}
get_element_names(cur_node->children);
}
}
static void AMOK_xml_parse(char *content, int length) {
xmlDocPtr doc;
xmlNode *root_element = NULL;
doc = xmlReadMemory(content, length, "noname.xml", NULL, 0);
if(doc == NULL)
{
fprintf(stderr, "Failed to parse document\n");
return;
}
else
{
root_element = xmlDocGetRootElement(doc);
get_element_names(root_element);
}
xmlFreeDoc(doc);
}
int main()
{
int sock, buffsize = 1024, first = 1, last = 100, i = first;
struct sockaddr_in server_addr;
struct hostent *host;
char send_data[1], *recv_data_temp = malloc(buffsize), *recv_data_load = malloc(buffsize);
char* ipPattern = "127.0.0.%d";
LIBXML_TEST_VERSION
if((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
{
perror("socket");
exit(1);
}
server_addr.sin_family = AF_INET;
sprintf(send_data, "\0");
while(1)
{
for(; i < last + 1; i++)
{
id = i;
char* ip = (char*)malloc((strlen(ipPattern) + 2) * sizeof(char));
sprintf(ip, ipPattern, i);
host = (struct hostent *) gethostbyname(ip);
server_addr.sin_port = htons(TEMP_PORT);
server_addr.sin_addr = *((struct in_addr *) host->h_addr);
bzero(&(server_addr.sin_zero),8);
if(sendto(sock, send_data, strlen(send_data), 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != -1)
{
if(recv(sock, recv_data_temp, buffsize, 0) == -1)
{
perror("recvfrom()");
}
else
{
AMOK_xml_parse(recv_data_temp, strlen(recv_data_temp));
}
}
server_addr.sin_port = htons(LOAD_PORT);
if(sendto(sock, send_data, strlen(send_data), 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != -1)
{
if(recv(sock, recv_data_load, buffsize, 0) == -1)
{
perror("recvfrom()");
}
else
{
AMOK_xml_parse(recv_data_load, strlen(recv_data_load));
}
}
free(ip);
}
sleep(30);
i = first;
}
}
Ale te if'y na sendto to chyba nie jest dobre rozwiązanie?
Problem jest taki, że pod adresami do których coś wysyłam/odbieram nie zawsze stoją serwery, w takim momencie program powinien po prostu przeskoczyć to i iść dalej, ale w takim przypadku jak mam teraz zawiesza się w którymś momencie (chyba recv()) jeśli pod podanym adresem nie ma serwera.
Wie ktoś może jak to rozwiązać?