#include "ioserver.h"
using namespace LCBTest;
SockFD::SockFD(int sock)
{
assert(sock >= 0);
fd = sock;
naddr = sizeof(sa_local);
int rv = getsockname(fd, (struct sockaddr *)&sa_local, &naddr);
assert(rv == 0);
}
void
SockFD::loadRemoteAddr()
{
socklen_t lentmp = sizeof(sa_remote);
getpeername(*this, (struct sockaddr *)&sa_remote, &lentmp);
}
void
SockFD::close()
{
if (fd != -1) {
shutdown(fd, SHUT_RDWR);
::closesocket(fd);
fd = -1;
}
}
SockFD::~SockFD()
{
close();
}
SockFD *
SockFD::acceptClient()
{
struct sockaddr_storage newaddr;
socklen_t newlen = sizeof(newaddr);
int newsock = accept(*this, (struct sockaddr *)&newaddr, &newlen);
return new SockFD(newsock);
}
SockFD *
SockFD::newListener()
{
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
int lsnfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = 0;
bind(lsnfd, (struct sockaddr *)&addr, sizeof(addr));
listen(lsnfd, 5);
return new SockFD(lsnfd);
}
SockFD *
SockFD::newClient(SockFD *server)
{
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
assert(sockfd >= 0);
int rv = connect(sockfd, (struct sockaddr *)&server->localAddr4(),
sizeof(struct sockaddr_in));
assert(rv == 0);
return new SockFD(sockfd);
}
#ifndef _WIN32
std::string
SockFD::getHostCommon(sockaddr_storage *ss)
{
struct sockaddr_in *addr = (struct sockaddr_in *)ss;
char buf[4096];
inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(*addr));
return std::string(buf);
}
#else
std::string
SockFD::getHostCommon(sockaddr_storage *ss)
{
struct sockaddr_in *inaddr = (struct sockaddr_in *)ss;
char *buf = inet_ntoa(inaddr->sin_addr);
return std::string(buf);
}
#endif