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ć?