AP_HAL: added listen and accept APIs to socket API

This commit is contained in:
Andrew Tridgell 2015-07-29 09:07:41 +10:00
parent b07f7e873f
commit 596ecde70d
2 changed files with 44 additions and 4 deletions

View File

@ -25,12 +25,19 @@
constructor
*/
SocketAPM::SocketAPM(bool _datagram) :
datagram(_datagram)
SocketAPM(_datagram,
socket(AF_INET, _datagram?SOCK_DGRAM:SOCK_STREAM, 0))
{}
SocketAPM::SocketAPM(bool _datagram, int _fd) :
datagram(_datagram),
fd(_fd)
{
fd = socket(AF_INET, datagram?SOCK_DGRAM:SOCK_STREAM, 0);
fcntl(fd, F_SETFD, FD_CLOEXEC);
int one = 1;
setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one));
if (!datagram) {
int one = 1;
setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one));
}
}
SocketAPM::~SocketAPM()
@ -154,4 +161,29 @@ bool SocketAPM::pollin(uint32_t timeout_ms)
return true;
}
/*
start listening for new tcp connections
*/
bool SocketAPM::listen(uint16_t backlog)
{
return ::listen(fd, (int)backlog) == 0;
}
/*
accept a new connection. Only valid for TCP connections after
listen has been used. A new socket is returned
*/
SocketAPM *SocketAPM::accept(uint32_t timeout_ms)
{
if (!pollin(timeout_ms)) {
return NULL;
}
int newfd = ::accept(fd, NULL, NULL);
if (newfd == -1) {
return NULL;
}
return new SocketAPM(false, newfd);
}
#endif // HAL_OS_SOCKETS

View File

@ -34,6 +34,7 @@
class SocketAPM {
public:
SocketAPM(bool _datagram);
SocketAPM(bool _datagram, int _fd);
~SocketAPM();
bool connect(const char *address, uint16_t port);
@ -48,6 +49,13 @@ public:
// return true if there is pending data for input
bool pollin(uint32_t timeout_ms);
// start listening for new tcp connections
bool listen(uint16_t backlog);
// accept a new connection. Only valid for TCP connections after
// listen has been used. A new socket is returned
SocketAPM *accept(uint32_t timeout_ms);
private:
bool datagram;
int fd = -1;