1
0
mirror of https://github.com/VCMP-SqMod/SqMod.git synced 2025-02-15 09:17:13 +01:00
Sandu Liviu Catalin 4a6bfc086c Major plugin refactor and cleanup.
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.
2021-01-30 08:51:39 +02:00

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