Added ability to toggle socket blocking mode
This commit is contained in:
parent
eec630ed24
commit
27a88febfa
@ -67,6 +67,7 @@ inline void *get_sin_addr(struct sockaddr *sa)
|
|||||||
#define SOCKET_ERROR -1
|
#define SOCKET_ERROR -1
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
#define FRNETLIB_SOCKET_H
|
#define FRNETLIB_SOCKET_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "NetworkEncoding.h"
|
||||||
#include "Packet.h"
|
#include "Packet.h"
|
||||||
|
|
||||||
namespace fr
|
namespace fr
|
||||||
@ -21,9 +22,11 @@ namespace fr
|
|||||||
BindFailed = 3,
|
BindFailed = 3,
|
||||||
Disconnected = 4,
|
Disconnected = 4,
|
||||||
Error = 5,
|
Error = 5,
|
||||||
|
WouldBlock = 6,
|
||||||
};
|
};
|
||||||
|
|
||||||
Socket()
|
Socket()
|
||||||
|
: is_blocking(true)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -88,9 +91,33 @@ namespace fr
|
|||||||
return socket_descriptor;
|
return socket_descriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* Sets the socket to blocking or non-blocking.
|
||||||
|
*
|
||||||
|
* @param should_block True for blocking (default argument), false otherwise.
|
||||||
|
*/
|
||||||
|
inline virtual void set_blocking(bool should_block = true)
|
||||||
|
{
|
||||||
|
//Don't update it if we're already in that mode
|
||||||
|
if(should_block == is_blocking)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Different API calls needed for both windows and unix
|
||||||
|
#ifdef WIN32
|
||||||
|
u_long non_blocking = should_block ? 0 : 1;
|
||||||
|
ioctlsocket(socket_descriptor, FIONBIO, &non_blocking);
|
||||||
|
#else
|
||||||
|
int flags = fcntl(socket_descriptor, F_GETFL, 0);
|
||||||
|
fcntl(socket_descriptor, F_SETFL, is_blocking ? flags ^ O_NONBLOCK : flags ^= O_NONBLOCK);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
is_blocking = should_block;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int32_t socket_descriptor;
|
int32_t socket_descriptor;
|
||||||
std::string remote_address;
|
std::string remote_address;
|
||||||
|
bool is_blocking;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -44,19 +44,17 @@ namespace fr
|
|||||||
{
|
{
|
||||||
sent += status;
|
sent += status;
|
||||||
}
|
}
|
||||||
else
|
else if(errno != EWOULDBLOCK && errno != EAGAIN) //Don't exit if the socket just couldn't block
|
||||||
{
|
{
|
||||||
if(status == -1)
|
if(status == -1)
|
||||||
{
|
{
|
||||||
return Socket::Status::Error;
|
return Socket::Status::Error;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
is_connected = false;
|
is_connected = false;
|
||||||
return Socket::Status::Disconnected;
|
return Socket::Status::Disconnected;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return Socket::Status::Success;
|
return Socket::Status::Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,16 +120,18 @@ namespace fr
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(status == -1)
|
if(errno == EWOULDBLOCK || errno == EAGAIN)
|
||||||
|
{
|
||||||
|
return Socket::Status::WouldBlock;
|
||||||
|
}
|
||||||
|
else if(status == -1)
|
||||||
{
|
{
|
||||||
return Socket::Status::Error;
|
return Socket::Status::Error;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
is_connected = false;
|
is_connected = false;
|
||||||
return Socket::Status::Disconnected;
|
return Socket::Status::Disconnected;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if(received > data_size)
|
if(received > data_size)
|
||||||
received = data_size;
|
received = data_size;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user