Added timeout to Commit()

This commit is contained in:
Frank Schmirler 2012-03-03 23:04:11 +01:00
parent a047fc7d32
commit c1dc1453c5
3 changed files with 37 additions and 10 deletions

View File

@ -1,6 +1,7 @@
VDR Plugin 'streamdev' Revision History
---------------------------------------
- Added timeout to Connect()
- Report the server-side HTTP status "503 Service unavailable" instead of
the client-side error "409 Conflict" when a channel is unavailable
(suggested by Methodus)

View File

@ -1,4 +1,5 @@
#include "tools/socket.h"
#include "tools/select.h"
#include <vdr/tools.h>
#include <string.h>
@ -27,7 +28,7 @@ cTBSocket::~cTBSocket() {
if (IsOpen()) Close();
}
bool cTBSocket::Connect(const std::string &Host, unsigned int Port) {
bool cTBSocket::Connect(const std::string &Host, unsigned int Port, unsigned int TimeoutMs) {
socklen_t len;
int socket;
@ -45,14 +46,37 @@ bool cTBSocket::Connect(const std::string &Host, unsigned int Port) {
return false;
}
if (TimeoutMs > 0 && ::fcntl(socket, F_SETFL, O_NONBLOCK) == -1) {
::close(socket);
return false;
}
m_RemoteAddr.sin_family = AF_INET;
m_RemoteAddr.sin_port = htons(Port);
m_RemoteAddr.sin_addr.s_addr = inet_addr(Host.c_str());
if (::connect(socket, (struct sockaddr*)&m_RemoteAddr,
sizeof(m_RemoteAddr)) == -1) {
if (::connect(socket, (struct sockaddr*)&m_RemoteAddr, sizeof(m_RemoteAddr)) == -1) {
if (TimeoutMs > 0 && errno == EINPROGRESS) {
int so_error;
socklen_t len = sizeof(so_error);
cTBSelect select;
select.Add(socket);
if (select.Select(TimeoutMs) == -1 ||
::getsockopt(socket, SOL_SOCKET, SO_ERROR, &so_error, &len) == -1) {
::close(socket);
return false;
}
if (so_error) {
errno = so_error;
::close(socket);
return false;
}
}
else {
::close(socket);
return false;
}
}
if (m_Type == SOCK_STREAM) {
len = sizeof(struct sockaddr_in);

View File

@ -32,11 +32,13 @@ public:
Reimplemented for TCP/IPv4 sockets. */
virtual ssize_t SysWrite(const void *Buffer, size_t Length) const;
/* Connect() tries to connect an available local socket to the port given
by Port of the target host given by Host in numbers-and-dots notation
(i.e. "212.43.45.21"). Returns true if the connection attempt was
successful and false otherwise, setting errno appropriately. */
virtual bool Connect(const std::string &Host, uint Port);
/* Connect() tries to connect an available local socket within TimeoutMs
milliseconds to the port given by Port of the target host given by
Host in numbers-and-dots notation (i.e. "212.43.45.21"). A TimeoutMs
of 0 will disable non-blocking IO for the connect call. Returns true
if the connection attempt was successful and false otherwise, setting
errno appropriately. */
virtual bool Connect(const std::string &Host, uint Port, uint TimeoutMs = 0);
/* Shutdown() shuts down one or both ends of a socket. If called with How
set to SHUT_RD, further reads on this socket will be denied. If called