151 if (WSAStartup(MAKEWORD(2, 2), &m_wsa) != 0) {
152 std::stringstream ss;
153 ss <<
"Failed WSAStartup for the server, error code: " << WSAGetLastError();
159 m_socketFileDescriptor = socket(AF_INET, SOCK_DGRAM, 0);
161 if (m_socketFileDescriptor == INVALID_SOCKET)
163 if (m_socketFileDescriptor < 0)
168 memset(&m_serverAddress, 0,
sizeof(m_serverAddress));
169 std::stringstream ss;
171 struct addrinfo hints;
172 struct addrinfo *result =
nullptr;
173 struct addrinfo *ptr =
nullptr;
175 memset(&hints, 0,
sizeof(hints));
176 hints.ai_family = AF_INET;
177 hints.ai_socktype = SOCK_DGRAM;
178 hints.ai_protocol = IPPROTO_UDP;
180 DWORD dwRetval = getaddrinfo(hostname.c_str(), ss.str().c_str(), &hints, &result);
183 ss <<
"getaddrinfo failed with error: " << dwRetval;
187 for (ptr = result; ptr !=
nullptr; ptr = ptr->ai_next) {
188 if (ptr->ai_family == AF_INET && ptr->ai_socktype == SOCK_DGRAM) {
189 m_serverAddress = *(
struct sockaddr_in *)ptr->ai_addr;
194 freeaddrinfo(result);
196 m_serverLength =
sizeof(m_serverAddress);
229 FD_SET(m_socketFileDescriptor, &s);
230 struct timeval timeout;
232 timeout.tv_sec = timeoutMs / 1000;
233 timeout.tv_usec = (timeoutMs % 1000) * 1000;
235 int retval = select(
static_cast<int>(m_socketFileDescriptor) + 1, &s,
nullptr,
nullptr, timeoutMs > 0 ? &timeout :
nullptr);
238 std::cerr <<
"Error select!" << std::endl;
244 int length =
static_cast<int>(recvfrom(m_socketFileDescriptor, m_buf,
sizeof(m_buf), 0,
245 (
struct sockaddr *)&m_serverAddress, (socklen_t *)&m_serverLength));
247 return length < 0 ? -1 : 0;
250 msg = std::string(m_buf, length);
275 FD_SET(m_socketFileDescriptor, &s);
276 struct timeval timeout;
278 timeout.tv_sec = timeoutMs / 1000;
279 timeout.tv_usec = (timeoutMs % 1000) * 1000;
281 int retval = select(
static_cast<int>(m_socketFileDescriptor) + 1, &s,
nullptr,
nullptr, timeoutMs > 0 ? &timeout :
nullptr);
284 std::cerr <<
"Error select!" << std::endl;
290 int length =
static_cast<int>(recvfrom(m_socketFileDescriptor, (
char *)msg,
static_cast<int>(len), 0,
291 (
struct sockaddr *)&m_serverAddress, (socklen_t *)&m_serverLength));
293 return length < 0 ? -1 : 0;
333 if (msg.size() > VP_MAX_UDP_PAYLOAD) {
334 std::cerr <<
"Message is too long!" << std::endl;
339#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
340 return static_cast<int>(
341 sendto(m_socketFileDescriptor, msg.c_str(), msg.size(), 0, (
struct sockaddr *)&m_serverAddress, m_serverLength));
343 return sendto(m_socketFileDescriptor, msg.c_str(),
static_cast<int>(msg.size()), 0, (
struct sockaddr *)&m_serverAddress,
362 if (len > VP_MAX_UDP_PAYLOAD) {
363 std::cerr <<
"Message is too long!" << std::endl;
368#if !defined(_WIN32) && (defined(__unix__) || defined(__unix) || (defined(__APPLE__) && defined(__MACH__)))
369 return static_cast<int>(
370 sendto(m_socketFileDescriptor, msg, len, 0, (
struct sockaddr *)&m_serverAddress, m_serverLength));
372 return sendto(m_socketFileDescriptor, (
char *)msg,
static_cast<int>(len), 0, (
struct sockaddr *)&m_serverAddress, m_serverLength);