1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
static gchar *gfire_server_browser_send_packet(const guint32 server_ip, const gint server_port, const gchar server_query[])
{
if(server_ip && server_port && server_query)
{
// Create socket and set options
int query_socket;
struct sockaddr_in query_address;
unsigned short int query_port = server_port;
// Open socket using UDP
if((query_socket = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
return NULL;
query_address.sin_family = AF_INET;
query_address.sin_addr.s_addr = server_ip;
query_address.sin_port = htons(query_port);
// Send query
if(sendto(query_socket, server_query, strlen(server_query), 0, (struct sockaddr *)&query_address, sizeof(query_address)) < 0)
return NULL;
// Wait for response
char response[GFIRE_SERVER_BROWSER_BUF];
int n_read;
// Define query timeout
struct timeval timeout;
timeout.tv_sec = 10;
timeout.tv_usec = 500 * 1000;
setsockopt(query_socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval));
// Read query response
n_read = recvfrom(query_socket, response, GFIRE_SERVER_BROWSER_BUF, 0, NULL, NULL);
if(n_read <= 0)
{
close(query_socket);
return NULL;
}
// Close socket
close(query_socket);
// Return response
return g_strdup_printf("%s", response);
}
else
return NULL;
} |
Partager