rendered paste body== socketaddress.h ==
#include <sys/socket.h>
class SocketAddress
{
public:
virtual bool isValid() = 0;
virtual operator socklen_t() = 0;
virtual struct sockaddr& getSockAddr() = 0;
virtual ~SocketAddress() {}
SocketAddress() {}
};
== ipv4address.h ==
#include <sys/types.h>
#include <netinet/in.h>
#include "socketaddress.h"
class IPv4Address : public SocketAddress
{
public:
IPv4Address(char* addr, char* port);
IPv4Address(uint32_t addr, uint16_t port);
IPv4Address(char* port);
IPv4Address(uint16_t port);
IPv4Address();
~IPv4Address();
operator socklen_t();
bool isValid();
struct sockaddr_in m_addr;
struct sockaddr& getSockAddr();
};
== ipv4address.cpp ==
#include "ipv4address.h"
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <arpa/inet.h>
IPv4Address::IPv4Address(char* addr, char* port)
{
IPv4Address(inet_addr(addr),htons(atoi(port)));
}
IPv4Address::IPv4Address(char* port)
{
IPv4Address(htons(atoi(port)));
}
IPv4Address::IPv4Address(uint32_t addr, uint16_t port) : m_addr()
{
memset(&m_addr, 0, sizeof(m_addr));
m_addr.sin_family = AF_INET;
m_addr.sin_port = port;
m_addr.sin_addr.s_addr = addr;
std::cout << "m_addr.sin_family=" << m_addr.sin_family << " == " << AF_INET << "\n";
}
IPv4Address::IPv4Address(uint16_t port)
{
IPv4Address(htonl(INADDR_ANY), port);
}
IPv4Address::IPv4Address()
{
IPv4Address(htonl(INADDR_ANY), 0);
}
IPv4Address::~IPv4Address()
{
}
IPv4Address::operator socklen_t()
{
return sizeof(m_addr);
}
struct sockaddr& IPv4Address::getSockAddr()
{
return (struct sockaddr&) m_addr;
}
bool IPv4Address::isValid()
{
std::cout << "IPv4Address::isValid() m_addr.sin_family == " << m_addr.sin_family << "\n";
return (m_addr.sin_family == AF_INET);
}
== test_tcp_main.cpp ==
#include "netmanager.h"
#include "ipv4address.h"
#include "testtcpsocket.h"
#include "listensocket.h"
#include <iostream>
#include <sys/socket.h>
int main(int argc, char* argv[])
{
NetManager* nm = NetManager::instance();
ListenSocket<TestTCPSocket> ls(*nm);
IPv4Address any("9001");
std::cout << "any->sin_family == " << any.m_addr.sin_family << "\n";
int ret;
ret = ls.bind(any);
std::cout << "bind returned " << ret << "\n";
ret = ls.listen(1);
std::cout << "listen returned " << ret << "\n";
nm->addSocket(ls);
while(true)
{
std::cout << "** select() **\n";
nm->select(NULL);
}
}