map/das-dn/third_party/AdsLib/Sockets.h
2024-12-05 11:04:47 +08:00

73 lines
1.9 KiB
C++

// SPDX-License-Identifier: MIT
/**
Copyright (c) 2015 - 2022 Beckhoff Automation GmbH & Co. KG
*/
#pragma once
#include "Frame.h"
#include "wrap_socket.h"
#include <stdexcept>
#include <string>
namespace bhf
{
namespace ads
{
using AddressList = std::unique_ptr<struct addrinfo, void (*)(struct addrinfo*)>;
/**
* Splits the provided host string into host and port. If no port was found
* in the host string, the provided default port is used.
*/
AddressList GetListOfAddresses(const std::string& hostPort, const std::string& defaultPort = {});
}
}
struct IpV4 {
const uint32_t value;
IpV4(const std::string& addr);
IpV4(uint32_t __val);
bool operator<(const IpV4& ref) const;
bool operator==(const IpV4& ref) const;
};
struct Socket {
Frame& read(Frame& frame, timeval* timeout) const;
size_t read(uint8_t* buffer, size_t maxBytes, timeval* timeout) const;
size_t write(const Frame& frame) const;
void Shutdown();
struct TimeoutEx : std::runtime_error {
TimeoutEx(const char* _Message) : std::runtime_error(_Message)
{}
};
protected:
int m_WSAInitialized;
SOCKET m_Socket;
sockaddr_storage m_SockAddress;
const sockaddr* const m_DestAddr;
socklen_t m_DestAddrLen;
Socket(const struct addrinfo* host, int type);
~Socket();
bool Select(timeval* timeout) const;
};
struct TcpSocket : Socket {
TcpSocket(const struct addrinfo* host);
uint32_t Connect() const;
/**
* Confirm if this TcpSocket is connected to one of the target addresses.
* @param[in] targetAddresses pointer to a previously allocated list of
* "struct addrinfo" returned by getaddrinfo(3).
* @return true, this connection can be used to reach one of the targetAddresses.
*/
bool IsConnectedTo(const struct addrinfo* targetAddresses) const;
};
struct UdpSocket : Socket {
UdpSocket(const struct addrinfo* host);
};