mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2025-02-15 09:17:13 +01:00
Switched to POCO library for unified platform/library interface. Deprecated the external module API. It was creating more problems than solving. Removed most built-in libraries in favor of system libraries for easier maintenance. Cleaned and secured code with help from static analyzers.
159 lines
3.1 KiB
C++
159 lines
3.1 KiB
C++
//
|
|
// UDPClient.h
|
|
//
|
|
// Library: Net
|
|
// Package: UDP
|
|
// Module: UDPClient
|
|
//
|
|
// Definition of the UDPClient class.
|
|
//
|
|
// Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
|
|
// and Contributors.
|
|
//
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
//
|
|
|
|
|
|
#ifndef Net_UDPClient_INCLUDED
|
|
#define Net_UDPClient_INCLUDED
|
|
|
|
|
|
#include "Poco/Net/Net.h"
|
|
#include "Poco/Net/SocketAddress.h"
|
|
#include "Poco/Net/DatagramSocket.h"
|
|
#include "Poco/Timespan.h"
|
|
#include "Poco/Runnable.h"
|
|
#include "Poco/Thread.h"
|
|
|
|
|
|
namespace Poco {
|
|
namespace Net {
|
|
|
|
|
|
class Net_API UDPClient : public Poco::Runnable
|
|
/// UDP client can either send, or send/receive UDP packets.
|
|
/// The mode of operation is specified at construction time.
|
|
/// If receiving functionality is enabled, it will run in a
|
|
/// separate thread.
|
|
/// This class is written as a "companion" to Poco::Net::UDPServer.
|
|
/// For other servers, inherit from this class and override the
|
|
/// handleResponse(char*, int) virtual member.
|
|
{
|
|
public:
|
|
UDPClient(const std::string& address, Poco::UInt16 port, bool listen = false);
|
|
/// Creates UDP client and connects it to specified address/port.
|
|
/// If listen is true, a thread is launched where client can receive
|
|
/// responses rom the server.
|
|
|
|
virtual ~UDPClient();
|
|
/// Destroys UDPClient.
|
|
|
|
void run();
|
|
/// Runs listener (typically invoked internally, in separate thread).
|
|
|
|
SocketAddress address() const;
|
|
/// Returns client address.
|
|
|
|
SocketAddress peerAddress() const;
|
|
/// Returns server address.
|
|
|
|
int send(void* data, int length);
|
|
/// Sends data.
|
|
|
|
int send(const SocketBufVec& vec);
|
|
/// Sends data.
|
|
|
|
virtual int handleResponse(char* buffer, int length);
|
|
/// Handles responses from UDP server. For non-POCO UDP servers,
|
|
/// this function should be overriden in inheriting class.
|
|
|
|
void setOption(int opt, int val);
|
|
/// Sets socket option.
|
|
|
|
int getOption(int opt);
|
|
/// Returns socket option.
|
|
|
|
void stop();
|
|
/// Stops the server reply receiving thread, if running.
|
|
|
|
int dataBacklog() const;
|
|
/// Returns current server data backlog.
|
|
|
|
int errorBacklog();
|
|
/// Returns current server error backlog.
|
|
|
|
private:
|
|
DatagramSocket _socket;
|
|
SocketAddress _address;
|
|
Thread* _pThread;
|
|
bool _stop;
|
|
Poco::AtomicCounter _dataBacklog;
|
|
Poco::AtomicCounter _errorBacklog;
|
|
};
|
|
|
|
|
|
//
|
|
// inlines
|
|
//
|
|
|
|
inline SocketAddress UDPClient::address() const
|
|
{
|
|
return _socket.address();
|
|
}
|
|
|
|
|
|
inline SocketAddress UDPClient::peerAddress() const
|
|
{
|
|
return _address;
|
|
}
|
|
|
|
|
|
inline int UDPClient::send(void* data, int length)
|
|
{
|
|
return _socket.sendBytes(data, length);
|
|
}
|
|
|
|
|
|
inline int UDPClient::send(const SocketBufVec& vec)
|
|
{
|
|
return _socket.sendBytes(vec);
|
|
}
|
|
|
|
|
|
inline void UDPClient::setOption(int opt, int val)
|
|
{
|
|
_socket.setOption(SOL_SOCKET, opt, val);
|
|
}
|
|
|
|
|
|
inline int UDPClient::getOption(int opt)
|
|
{
|
|
int val = 0;
|
|
_socket.getOption(SOL_SOCKET, opt, val);
|
|
return val;
|
|
}
|
|
|
|
|
|
inline void UDPClient::stop()
|
|
{
|
|
_stop = true;
|
|
}
|
|
|
|
|
|
inline int UDPClient::dataBacklog() const
|
|
{
|
|
return _dataBacklog;
|
|
}
|
|
|
|
|
|
inline int UDPClient::errorBacklog()
|
|
{
|
|
return _errorBacklog;
|
|
}
|
|
|
|
|
|
} } // namespace Poco::Net
|
|
|
|
|
|
#endif // Net_UDPClient_INCLUDED
|