-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathudp.cpp
94 lines (72 loc) · 2.5 KB
/
udp.cpp
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <QHostInfo>
#include <string.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include "udp.h"
sysmonUDP::sysmonUDP( QString* server, int port )
{
QHostInfo hostInfo;
QHostInfo returnedHost = hostInfo.fromName( *server );
if ( returnedHost.error() != QHostInfo::NoError )
{
lookupOK = false;
return;
}
lookupOK = true;
QString ip = returnedHost.addresses().first().toString();
//qDebug() << "Found address:" << ip.toLatin1();
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
// server socket
memset( (char*) &server_socket, 0, sizeof(server_socket) );
server_socket.sin_family = AF_INET;
server_socket.sin_port = htons( port );
server_socket.sin_addr.s_addr = inet_addr( ip.toLatin1() );
udp_socket = socket( AF_INET, SOCK_DGRAM, 0);
// Make the socket time out after the timeval duration
setsockopt( udp_socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof( tv ) );
}
QString sysmonUDP::getData()
{
if ( ! lookupOK ) return "Bad IP lookup";
QByteArray data_out = QByteArray( "Send data" );
//qDebug() << "Size of data_out should be 9: " << data_out.size();
// Ask for data
ssize_t i =
sendto( udp_socket,
data_out.data(),
data_out.size() + 1, // Add trailing null
MSG_CONFIRM,
(struct sockaddr*)& server_socket,
sizeof( server_socket ) );
//qDebug() << "Bytes sent: " << i;
if ( i < 0 ) return "UDP out failed";
//qDebug() << "ip:" << ip << "; port:" << serverPort; // ok
struct sockaddr_in client_socket;
memset( (char*)& client_socket, 0, sizeof(client_socket) );
client_socket.sin_family = AF_INET;
client_socket.sin_port = htons( 0 );
client_socket.sin_addr.s_addr = htonl( INADDR_ANY );
socklen_t socket_len;
#define BUFFER_SIZE 1024
char data_in [ BUFFER_SIZE ];
memset( (char*)& data_in, 0, BUFFER_SIZE );
// Now read the response
int n =
recvfrom( udp_socket,
data_in,
BUFFER_SIZE,
MSG_WAITALL,
(struct sockaddr*)& client_socket,
&socket_len );
//qDebug() << "Bytes received: " << n;
//qDebug() << data_in;
if ( n < 0 )
return "Timeout";
//data_in[ n ] = '\0'; // make sure the string is properly terminated
QString s = QString( data_in );
//qDebug() << s << "\n--- size of string:" << s.size();
//return QString( data_in );
return s;
}